一、递归的引入
小故事:一个盒子里还有盒子,盒子的盒子里面还有盒子,祖母说钥匙就在其中某个盒子中,为找到钥匙,用什么算法
第一种方法:----普通while循环
第二种方法:---递归,函数调用自己
总结:其实递归方案的引用,对程序的性能没什么影响,只是方便理解,所以具体应用中,需要考虑实际场景来使用递归
二、基线条件和递归条件
例如:我们编写一个倒计时的函数
def countdown(i):
print(i)
countdown(i-1)
countdown(2)
他会一直运行,因为我们没有告诉它什么时间结束,所以每个递归函数都有两个部分组成:基线条件、递归条件,递归条件是指自己调用自己,基线条件是指函数不再调用自己,从而避免形成无限循环
那么上面的函数添加了基线条件以后是这样的:其中 if 条件就是基线条件,else后面就是递归条件
def countdown(i):
print(i)
if i<=1:
return
else:
countdown(i-1)
countdown(10)
三、栈
1、栈是由一系列对象组成的一个集合,这些对象满足后近先出(LIFO)的原则。 和自动贩卖机卖水一样,也就是删除和插入都是最后一个。
2、调用栈:计算机在内部使用被称为调用栈的栈
3、执行递归的过程可以是调用栈的过程:例如递归函数的调用栈,5!=5*4*3*2*1
def fact(x):
if x==1:
return 1
else:
return x*fact(x-1)
i=int(fact(5))
print(i)
---执行递归的过程可以是调用栈的过程, 如下图, 调用的函数的执行内存都存放在栈对象中,执行完后被释放。
---使用栈虽然很方便,但是也要付出代价,存储详尽的信息可能占用大量的内存,每个函数调用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息,所以我们就需要重新编写代码。或者使用循环,或者使用尾递归