一、解释
递归:在调用一个函数的过程中,直接或间接地调用了函数本身这个就叫递归
注:Python在递归中没有像别的语言对递归进行优化,所以他的每一次调用都会基于上一次的调用进行,并且他设置了最大的递归数量防止递归外溢
二、实例
用递归计算菲波那切数列的和
def fib(n):
if n < 1:
print('请输入大于1的整数!')
if n == 1 or n == 2:
return 1
if n > 2:
return fib(n-1) + fib(n-2)
n = int(input('请输入大于1的正整数:'))
result = fib(n)
print('%d个斐波那契数列的和是%d' % (n,result))
三、优缺点
优点:
(1)定义简单。
(2)逻辑清晰,可读性更好。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
缺点:
(1)递归效率不高,递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现如果输入50的话,就会计算很长时间,就会不如数学计算的方式了(可以体验一下两个方法计算40个斐波那契数列的和的计算时间)。->效率
(2)调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,如果这个二叉树很庞大,调用的层次太多时,反复递归函数调用开销就很大,就会超出栈的容量,从而导致栈溢出。->性能
四、附件
数学计算斐波那契数列的和
def feb(n):
n1 = 1
n2 = 1
n3 = 1
if n < 1:
print('输入大于零的正整数')
return -1
while (n-2) > 0:
n3 = n2 + n1
n1 = n2
n2 = n3
n = n - 1
return n3
n = int(input('请输入一个大于零的正整数:'))
result = feb(n)
if result != -1:
print('{0}个斐波那契数列数列的和是{1}'.format(n,result))