何时用递归
需满足三个条件:
- 一个问题的解可以分解为几个子问题的解
- 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
- 存在递归终止条件
使用递归时注意要点
- 要注意避免堆栈溢出
- 要注意不要过量的重复性计算(可以利用map存储计算值)
递归与迭代的区别
- 递归是函数调用函数自身
- 迭代是变量自身的数值变化
简单例子
问题:假如现在有 n 个台阶,每次你可以跨 1 个台阶或者 2 个台阶,请问走这n个台阶有多少种走法?
解答:这个问题可以分解为,n个台阶的走法等于跨了一个台阶之后的台阶的走法加上跨了两个台阶之后的走法。用函数表示的话,就是 f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2) f(n)=f(n−1)+f(n−2)。那么,终止条件是什么呢?
有两个,当n为1时, f ( 1 ) = 1 f(1)=1 f(1)=1,当n为2时, f ( 2 ) = 2 f(2)=2 f(2)=2。
满足上面所述的使用递归所要具备的三个条件,接下来就转换为代码就行了。
def main():
n = input()
print(f(n))
def f(n):
s = {}
if n == 1:
return 1
if n == 2:
return 2
if n in s.keys():
print(n)
return s[n]
ret = (f(n-1) + f(n-2))
if n not in s.keys():
s[n] = ret
return ret
main()