递归
递归:自己调用自己
下面我们通过实现从1加到100来理解递归。
从1加到100一般我们采用循环实现。
sum = 0
for i in range(1,101):
sum += i
print(sum)
sum = 0
如果用递归实现
那么就是
def sum1(max):
if max <= 100 and max >=0: #递归条件
return max + sum1(max - 1)
else:
return 0
print(sum1(100))
将1加到100,是将问题拆分为,[1…99]+100,同时[1…99]可以拆分为[1…98]+99,这样不断地拆分下去,直到变为[1]+2,最后再将这些数加起来。
这里同时涉及到递归地基线条件和递归条件。
基线条件和递归条件
递归是自己调用自己,当没有结束条件时,便会无线调用自己,死循环。
如下面这个程序
def countdown(i):
print(i)
countdown(i-1)
countdown(3)
本意是想要打印3到0停止,而因为没有设置停止条件,导致无线循环,从而程序停止。
最终提示错误信息
RecursionError: maximum recursion depth exceeded while calling a Python object
基线条件
故基线条件就是递归停止的条件。
那么,这里我们需要到达0停止,则程序修改如下:
def countdown(i):
print(i)
if i <= 1: #基线条件
return
else:
countdown(i-1)
countdown(3)
结果:
递归条件
而递归条件便是,每次需要改变的最小值。
如这里将代码改为
def countdown(i):
print(i)
if i <= 1:
return
else:
countdown(i-2) #递归条件为其值-2,不再是-1
countdown(9)
结果如下:
栈
栈就是一个箱子,东西放进去以后,若要拿出最下面的东西,只有把上面的东西拿出来才能拿出最下面的东西。是一个先进后出的结构
def greet(name):
print("hello," + name + "!")
greet2(name)
print("getting ready to say bye ...")
bye()
def greet2(name):
print("how are you," + name + "?")
def bye():
print("ok,bye!")
greet("haobo")
最开始,栈为空,调用greet函数,那么greet函数进栈。
开始执行,先print打印(在python中print也是一个函数,这里方便理解,省略其进栈过程。)
在greet执行过程中,调用了greet2函数,故greet2进栈。
执行greet2后,出栈,greet继续执行,执行print后,再调用bey函数进栈执行。
最后执行完成后,栈为空。
执行结果如下:相信你能理解!
下面再用一个递归求阶乘的例子让你更加能够理解把。
def fact(x):
if x == 1:
return 1
else:
return x * fact(x-1)
print(fact(10))
将109…1>>10(9…1)>>10(9*(8*…1))最终变为10(9*(8*…*(1 )…)的样子。