递归的定义
在计算机科学当中是指一种通过重复将问题分解为同一类的子问题而解决问题的方法。递归方式可以被用于解决很多的计算机科学的问题,因此它是计算机科学领域中的一个十分重要的概念。绝大多数的编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。(python也不例外)计算机理论可以证明递归的作用,可以完全取代循环,因此很多编程语言中习惯用递归来实现循环。
优点:
代码更整洁,可读性比较好。
递归的话函数调用是有开销的,而且递归的次数受堆栈大小的限制。
缺点:
时间和空间消耗比较大。每一次函数调用都需要在内存栈中分配空间以保存参数,返回地址以及临时变量,而且往栈里面压入数据和弹出都需要时间。
另外递归会有重复的计算。递归本质是把一个问题分解为多个问题,如果这多个问题存在重复计算,有时候会随着n成指数增长。
递归还有栈溢出的问题,每个进程的栈容量是有限的。由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多。而且,如果递归深度太大,可能系统撑不住。
举例
在递归算法中最典型的例子就是斐波那契数列中的不死神兔的案例:
问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
规则:从第三项开始,每一项是前两项之和
且前两项是已知的
代码
def fact(n):
if n==1 or n==2 :
return 1
for i in range(n):
return fact(n-1)+fact(n-2)
print(fact(25))