【Python】Recursion递归 典型问题
这里是一个刚刚上手Python的小白整理的一些题型。大部分题目来自平时上课的例题及习题,在此稍作整理,以供复习之用。
因为平时全英文,有些专有名词不知道中文名,就直接用英文代替啦~
1. 二分法找有序数列指定值
写一个程序binary_search(x, y), 输入一个list x (你可以假设里面的数据已经按升序排列) 然后输入想要查找的数据y,使得函数返回y的index,或者当y不属于x时返回 “Not found”.
def binary_search(x,y):
a = 0
b = len(x) #如果这里打的是‘len(x)-1’,那么如果要查找最后一个数就会陷入死循环
c = (a+b)//2
if y not in x:
return 'Not found'
while x[c] != y:
if x[c] < y:
a = c
elif x[c] > y:
b = c
c = (a+b)//2
return c
这个问题如果以问法的话就只能写loop的函数,但其实它也可以用recursion解:
def binary_search(min, max, d, n): '''初始mid=0, max=len(d)'''
mid = (min+max)//2
if n not in d:
return 'Not found'
elif d[mid] < n:
return binary_search(mid, max, d, n)
elif d[mid] > n:
return binary_search(min, mid, d, n)
else:
return mid
2. 字符串(非重复)全排列
def permutation(array):
if len(array) <= 1:
return [array]
res = []
for i in range(len(array)):
s = array[:i] + array[i+1:] #每次拿出一个元素
p = permutation(s) #将剩下元素全排列
for x in p:
res.append(array[i:i+1]+x) #将该元素插到剩下元素后面
(或者要做有重复的也很简单,再写一个function把重复的去掉即可)
3. 爬楼梯问题
1)假设一共有n级台阶,每次可以跨1步或3步,求要爬完这一段台阶一共有多少种可能
(可以看成是斐波那契数列)
def func(n):
if n <= 2:
return 1
elif n == 3:
return 2
elif n > 3:
return func(n-1) + func(n-3)
2)假设一共有n级台阶,每次可以跨1步或3步,列举要爬完这一段台阶的所有可能
def func(n):
res = []
if n == 1:
return '1'
elif n == 2:
return '11'
elif n == 3:
return ['111', '3']
elif n > 3:
for i in func(n-1):
res.append(i + '1')
for i in func(n-3):
res.append(i + '3')
return res
4. Tower of Hanoi
1)假设一共有n块圆盘,求总共需要移动的次数
def han(n):
k = 0
if n == 1:
k += 1
elif n > 1:
k += 2*han(n-1) + 1
return k
2)假设一共有n块圆盘,求每次移动的步骤
def han(disc, frm, to, temp):
if disc == 1:
print('move disc' , 1, 'from', frm, 'to', to)
elif disc > 1:
han(disc-1, frm, temp, to)
print('move disc' , disc, 'from', frm, 'to', to)
han(disc-1, temp, to, frm)
5. 列举一个字符串中每一个字母的大小写全排列
Write a program to read a string input and then output a list of all possible case permutations of the string.(比如“Ab”,就有“ab,Ab,aB,AB”四种可能)
def case_permutation(array):
res = []
if len(array) <= 1:
res.append(array.lower())
res.append(array.upper())
return res
else:
s = array[0]
array = array[1:]
p = case_permutation(array)
for x in p:
res.append(s.lower()+x)
res.append(s.upper()+x)
return res
6. 判断回文
def is_pal(line):
n = len(line)
if n <= 1:
return True
elif n <= 3:
if linr[0] == line[n-1]:
return True
else:
return False
elif n > 3:
if line[0] == line[n-1]:
return is_pal(line[1:n-1]) '''删去第一个和最后一个字符'''
else:
return False
7. 寻找一个set的power set
(这里我自动默认已经把set转换成了一个list)
def power(s):
res = []
if len(s) == 1:
res.append([s[0]])
res.append([])
elif len(s) > 1:
for i in power(s[1:]):
res.append(i)
res.append(i+[s[0]])
return res
目前暂时整理了这么多,但只要把套路摸透,就会发现所有的recursion核心思路基本都一样
祝大家考试顺利,过三爆四~~
版权声明:本文为tangyd775原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。