3. 递归
创始人
2024-03-16 21:09:04
0

3.1 递归

假设你在祖母的阁楼中翻箱倒柜,发现了一个上锁的神秘手提箱。

祖母告诉你,钥匙很可能在下面这个盒子里。

这个盒子里有盒子,而盒子里的盒子又有盒子。钥匙就在某个盒子中。 为找到钥匙,你将使用什么算法?


第一种:

使用的是while循环:只要盒子堆不空,就从中取一个盒子,并在其中仔细查找。

伪码:

def look_for_key(main_box):pile = main_box.make_a_pile_to_look_through() while pile is not empty:box = pile.grab_a_box() for item in box:if item.is_a_box(): pile.append(item)elif item.is_a_key(): print "found the key!"

第二种:

方法使用递归——函数调用自己,伪代码如下:


def look_for_key(box): for item in box:if item.is_a_box():look_for_key(item) ←------递归! elif item.is_a_key():print "found the key!"

第二种方法更清晰。递归只是让解决方案更清晰,并没有性能上的优势。



3.2 基线条件和递归条件

编写递归函数时,必须告诉它何时停止递归。

正因为如此,每个递归函数都有两部分:基线条件 (base case)和递归条件 (recursive case)。

递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。


编写一个像下面这样倒计时的函数。

3…2…1

def countdown(i): print iif i <= 0: ←------基线条件 returnelse: ←------递归条件 countdown(i-1)


3.3 栈

假设你去野外烧烤,并为此创建了一个待办事项清单——一叠便条:
插入的待办事项放在清单的最前面;读取待办事项时,你只读取最上面的那个,并将其删除。

因此这个待办事项清单只有两种操作: 压入 (插入)和弹出 (删除并读取)。

这种数据结构称为栈 。


3.3.1 调用栈

这个栈用于存储多个函数的变量,被称为调用栈 。

3.3.2 递归调用栈

下面是计算阶乘的递归函数。

def fact(x): if x == 1: return 1else:return x * fact(x-1)

下面来详细分析调用fact(3) 时调用栈是如何变化的。

注意,每个fact 调用都有自己的x变量。在一个函数调用中不能访问另一个的x变量。


使用栈虽然很方便,但是也要付出代价:存储详尽的信息可能占用大量的内存。

每个函数调用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息。在这种情况下,你有两种选择:

重新编写代码,转而使用循环。
使用尾递归 。这是一个高级递归主题,不在本书的讨论范围内。 另外,并非所有的语言都支持尾递归。



References:
《 算法图解》—— 第3章 递归

相关内容

热门资讯

新华鲜报丨利好跨国公司!这项跨... 新华社北京12月26日电(记者刘开雄、吴雨)中国人民银行、国家外汇管理局12月26日发布通知,在总结...
日元空头共识渐成:2026年或... 随着日本央行最新加息举措未能提振汇率,华尔街对日元的看空情绪再度升温,市场正逐渐形成日元将长期疲软的...
北平锋:民进党当局对所谓“两岸... 12月26日,台湾《中国时报》报道,陆委会近日推动所谓“两岸人民关系条例”四项修正,包含:公务员赴陆...
AI核心产业超万亿,工信部将完... 今年,工业经济顶压前行、向新向优发展,展现强大韧性和活力。 12月25日至26日,全国工业和信息化工...
神州泰岳(300002)披露全... 截至2025年12月26日收盘,神州泰岳(300002)报收于11.37元,较前一交易日上涨0.09...
车企起诉电池企业第一案!吉利旗... 出品 | 搜狐汽车·汽车咖啡馆 作者 | 胡耀丹 2024年底发出的回旋镖,在2025年底向欣旺达疾...
海南产经新观察:封关政策释红利... 中新网海南东方12月26日电 (陈英清)“海南自贸港封关运作顺利实施,政策红利持续释放,南繁水稻制种...
无证售药、两地维权!养生馆纠纷... 一副自制中药制剂,引发两地法院诉讼;一次耐心调解,让双方握手言和。近日,饶平县人民法院调解一宗因养生...
*ST节能(000820)披露... 截至2025年12月26日收盘,*ST节能(000820)报收于3.36元,较前一交易日上涨0.9%...
疑电芯质量存问题,500亿巨头... 二线电池厂商欣旺达(300207.SZ)被起诉了! 12月26日盘后,欣旺达披露公告称,公司子公司欣...