一、什么是递归 (递归 百度百科)
程序调用自身的编程技巧称为递归(recursion)。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算。
二、如何使用递归解决问题
可以使用数学归纳法的思想来应用递归解决问题。
数学归纳法 (数学归纳法 百度百科)
最简单和常见的数学归纳法是证明当n等于任意一个自然数时某命题成立。证明分下面两步:
-
证明当n= 1时命题成立。
-
假设n=m时命题成立,那么可以推导出在n=m+1时命题也成立。(m代表任意自然数)
三、实例
1.问题:如何判断一个数是否为2的n次方?
数学归纳法分析:
1.如果数为1,则成立。
2.如果数m>1成立时,m/2也成立。
实现代码:
def fun(n):
assert n > 0 and type(n) is int
if n == 1:
return True
return n % 2 == 0 and fun(n // 2)
2.问题:递归实现斐波那契数列
实现代码:
def fun(n):
assert n > 0 and type(n) is int
if n <= 2:
return 1
return fun(n-1) + fun(n-2)
3.问题:假设10个球,每个球有黑白2色,用递归遍历所有情况
实现代码:
def fun(n=10):
if n == 1:
return ['黑', '白']
left, right = fun(n//2), fun(n-n//2)
return [i+j for i in left for j in right]
4.问题:删除字符串左右两端的空格
实现代码:
def fun(s):
if s[0] != ' ' and s[-1] != ' ':
return s
elif s[0] == ' ':
return fun(s[1:])
return fun(s[:-1])
5.问题:求一个数组的最大最小值
实现代码:
def fun(L):
assert type(L) is list and len(L)>0
if len(L) <= 2:
if L[0] > L[-1]:
return L[0], L[-1]
return L[-1], L[0]
half = len(L) // 2
left, right = fun(L[:half]), fun(L[half:])
Max = left[0] if left[0] > right[0] else right[0]
Min = left[1] if left[1] < right[1] else right[1]
return Max, Min
最后、实例暂且更新到这里,后期会持续补充,希望对大家有一些帮助