《算法图解》总结第3章:while循环、递归、栈

仅用于记录学习,欢迎批评指正,大神勿喷

while循环 & 递归

举例说明两者区别:发现一个上锁的神秘箱子,钥匙可能在一个盒子里,但是这个盒子里有盒子,盒子里的盒子又有盒子,钥匙在某个盒子里。
while循环来解决这个问题:
(1)创建一个要查找的盒子堆;
(2)从盒子里取出一个盒子,在里面找;
(3)如果找到的是盒子,将其加入盒子堆里,以便以后再查找;
(4)如果找到钥匙大功告成;
(5)返回第二步,继续拆盒子。
简而言之:只要盒子堆不空,就从中取一个盒子,并在其中仔细查找。
算法实现:Python
《算法图解》总结第3章:while循环、递归、栈
递归来解决这个问题:
(1)检查盒子里的每样东西;
(2)如果是盒子,就回到第一步;
(3)如果是钥匙,就大功告成。
简而言之:拿到一个盒子,就一直拆,要么拆到有钥匙,要么拆完。
算法实现:Python
《算法图解》总结第3章:while循环、递归、栈
递归条件:基线条件和递归条件
编写递归函数时,必须告诉它何时停止递归,避免形成无线循环。因此每个递归函数都有两部分:基线条件和递归条件。递归条件指的是函数调用自己,而基线条件指的是函数不再调用自己,从而避免形成无限循环。
举例说明:
《算法图解》总结第3章:while循环、递归、栈

这是没有添加基线条件的递归函数,若i从3开始,将输出3,2,1,0,-1,-2…形成无限循环,必须强行停止。因此我们给countdown函数添加基线条件:
《算法图解》总结第3章:while循环、递归、栈

栈是一种简单的数据结构,只有两种操作:压入(插入)和弹出(删除并读取)。栈有先入后出的特点。
调用栈:这个栈用于存储多个函数的变量(在当前函数中调用其他函数)。
递归调用栈:递归函数中也使用了调用栈。以阶乘函数为例,编写Python代码如下:
《算法图解》总结第3章:while循环、递归、栈
栈的缺点:调用栈可能很长,这将占用大量内存,解决方法有两个:(1)重新编写代码,转而使用循环;(2)使用尾递归。