1.什么是递归?
递归可以把不能或不好解决的大问题 — >几个小问题—> 更小的问题—>直接解决问题
2.递归的两大条件:
(1) 边界条件(基线条件):确定递归到何时终止,也称为递归出口。(就是指函数不再调用自己)
(2) 递归模式(递归条件):大问题是如何分解为小问题的,也称为递归体。(函数调用自己)
3.递归的本质就是函数调用自己。
4.递归的优缺点:
优点:让解决方案更加清晰、更易理解。
缺点:调用自身函数以及向栈中压入弹出数据,都非常消耗空间和时间;存在重复计算(斐波那契数列);调用栈可能会溢出。
5.初识栈
看一个小例子来大体了解堆栈过程。
def hello(name):
print("hello! " + name + " good morning!")
hello2(name)
bye(name)
def hello2(name):
print(name + " have a nice day!")
def bye(name):
print(name + " bye bye~")
hello(name='PYTHON')
http://www.pythontutor.com使用这个工具看执行顺序
(我尝试录屏,发现无法上传,哭了)
当你调用一个函数时,计算机会先为这个函数调用分配一块内存。
需注意的点:
(1)调用另一个函数时,如果当前函数暂停并处于未完成状态,该函数的所有变量的值都还在内存中。
(2)执行hello2后,回到函数hello中,并从离开的地方开始接着往下执行。
回过头来,看看栈的定义:栈是一种操作受限制的线性表,将允许进行插入、删除的一端称为栈顶,另一端称为栈底。先进入的数据压入栈底,最后的数据在栈顶,需要读数据的时候,从栈顶开始弹出数据。(最后一个数据被第一个读出来)
阶乘问题:
(阶乘就是调用栈的)用这个工具,可以快速直接的看运行步骤。
栈虽然十分方便,但是会占有大量的内存,在此情况下,我们有两种选择,一是重新编写代码,转而使用循环。二是使用尾递归。(还不了解尾递归,后续补充)
参考书籍:算法图解