python|递归和循环

当需要重复多次计算相同的问题时,通常可以选择递归或者循环
函数直接或者间接调用自身就是递归

  • 必须有一个明确的递归结束条件,称为递归出口,否则就会无限调用(相当于死循环)。
  • 递归需要有边界条件、递归前进段和递归返回段。
  • 当边界条件不满足时,递归前进。当边界条件满足时,递归返回。
递归函数运行时需要较多次数的函数调用,每次都要创建新的变量,需要增加额外的堆栈处理,会对执行效率有一定影响,占用过多的内存资源。递归有深度限制,如果调用层次过深,函数反复压栈,会造成栈内存溢出。
下面来看两个小例子:
①求n 的阶乘 ,例如5! =5*4*3*2*1
【python|递归和循环】先用循环的方式实现:
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


    推荐阅读