当需要重复多次计算相同的问题时,通常可以选择递归或者循环
函数直接或者间接调用自身就是递归
- 必须有一个明确的递归结束条件,称为递归出口,否则就会无限调用(相当于死循环)。
- 递归需要有边界条件、递归前进段和递归返回段。
- 当边界条件不满足时,递归前进。当边界条件满足时,递归返回。
递归函数运行时需要较多次数的函数调用,每次都要创建新的变量,需要增加额外的堆栈处理,会对执行效率有一定影响,占用过多的内存资源。递归有深度限制,如果调用层次过深,函数反复压栈,会造成栈内存溢出。
下面来看两个小例子:
①求n 的阶乘 ,例如5! =5*4*3*2*1
先用循环的方式实现:
def fn(n,s=1):
for i in range(1,n+1):
s *=i
return s
用递归方式实现:
def fn(n):
if n ==1: #递归结束条件
return n
return n*fn(n-1)
#fn(5)= 5*fn(4) = 5*4*fn(3) = 5*4*3*fn(2) = 5*4*3*2*fn(1) = 5*4*3*2*1
#这是另一种递归形式
def fn(n,s=1):
if n=1:
return s
else:
return fn(n-1,s*n) #将累乘的结果传递到下一次调用中去
#fn(5,1)=>fn(4,5)=>fn(3,20)=>fn(2,60)=>fn(1,120)=>120
②猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共摘了多少个桃子?
用循环实现:
def peach(day=10,s=1):
for i in range(day-1):
s = (s+1)*2
return s
peach()
#运行结果:1534
用递归求解:
def peach(day=1):
if day==10: #设置边界条件
return 1
return (peach(day+1)+1)*2
#运行结果:1534
#另一种递归方式求解:
def peach(day=10,s=1):
if day==1:
return s
return peach(day-1,(s+1)*2) #将上一次计算结果传递到下一次计算中去
peach()
#运行结果:1534