递归
它通常都以一个递归函数体现出来
递归函数的特点:它在自己的内部调用自己(必须,不然体现不出递归的思想)和结束条件(可要可不要,但是如果缺了它,函数将永远执行下去)
我举几个栗子让大家理解
比如说这段代码
def dg(): #定义一个叫dg的递归函数
print('我真nb')
dg() #调用自己
如果我们调用dg这个递归函数,因为它没有结束条件,所以理论上它会永远执行下去
没错,它会打出一大堆“我真nb”
然后就要程序帮你结束了(不怀好意的笑容)
RecursionError: maximum recursion depth exceeded while calling a Python object
意思是你用递归太多了,不能再用了(超出递归最大深度)
PS:这种问题似乎只有Python有。。。
在现实使用时,不可能让递归函数永远执行下去
所以,我们需要给函数加上结束条件
比如我们要实现一个求斐波那契数列任意一项的函数fib
斐波那契数列_百度百科baike.baidu.com![51e29fcf3b6ebb5037de19ca53c3f093.png](https://i-blog.csdnimg.cn/blog_migrate/01c69f616be3200298286dd7851f1c3b.jpeg)
def fib(n):
if (n == 1 or n == 2): #满足递归函数结束条件:参数n为1或为2时
return 1 #返回1,因为斐波那契数列的前两位都是1
else: #不满足递归函数结束条件
return fib(n - 1) + fib(n - 2) #返回自己
如果我们调用fib(6),它的流程图
![1b8094f2787612b169267e7ced22f811.png](https://i-blog.csdnimg.cn/blog_migrate/676301e27f0116da4bd720f9c2602825.jpeg)
![1d77646c7140c3401e9050e0af8efff1.png](https://i-blog.csdnimg.cn/blog_migrate/39faeff3b85227e06700fc9d8a6fb5b3.jpeg)
没错,递归就是一个把问题拆成更小的问题(不断地返回自己),直到这个最小的问题可以被你解决(达到终止条件),然后一步步的反推回去,得到问题的解。
递归优化
任何一种算法能优化,递归也不例外。
我们再次回到那个fib函数的流程图上
发现了吗?竟然有好多是重复的!