黄色裤子配什么颜色上衣| 洋辣子蛰了用什么药| 吃海带有什么好处和坏处| 胃溃疡适合吃什么食物| 33数字代表什么意思| 澄字五行属什么| 怀孕第一个月最怕什么| 什么是员额制| 安痛定又叫什么名字| 蟑螂长什么样子| 胃酸胃胀吃什么药| 梦见婴儿是什么预兆| 大便深褐色是什么原因| 血糖偏高可以吃什么水果| 白蛋白偏高是什么原因| 鸡蛋加什么吃壮阳持久| 内分泌失调什么症状| 生菜什么时候种| 脚气是什么菌感染| 6.17什么星座| 葡萄球菌感染是什么原因引起的| 为什么医生都穿洞洞鞋| 总梦到一个人说明什么| 德巴金是什么药| 积劳成疾的疾是什么意思| 白马王子是什么意思| 糠是什么东西| 办健康证需要带什么| 上海属于什么方向| ifu是什么意思| 环比是什么意思| 兰精莫代尔是什么面料| 梦见自己出嫁是什么意思| 蛇胆疮是什么引起的| 偏印代表什么| 布洛芬的副作用是什么| 考c1驾照需要什么条件| 心脏病是什么原因引起的| 舌炎吃什么药| 一什么雨伞| 附件炎吃什么药| 吃什么菜对肝好怎么养肝| 胸口闷痛挂什么科| 什么什么之年| yjs是什么意思| 腋下出汗有异味是什么原因| 植物神经紊乱挂什么科| 马叉虫是什么意思| 请辞是什么意思| 元旦送什么礼物好| tdi是什么意思| 贫血是什么症状| 什么是虚拟币| 什么小兔| 见路不走是什么意思| 毛脚女婿是什么意思| 德国高速为什么不限速| 氧化铜什么颜色| 6.21什么星座| 三千大千世界什么意思| ppi是什么意思啊| 新生儿黄疸是什么原因引起的| 蜜蜡脱毛有什么危害吗| 阳历6月21日是什么星座| 什么的星空| 吃什么补充维生素b| 去越南要注意什么| 吃什么提高记忆力| 宝宝拉肚子有粘液是什么原因| 酒是什么时候发明的| 什么能助睡眠| 金匮是什么意思| 内膜薄吃什么增长最快| 晧字五行属什么| 内分泌紊乱有什么症状表现| 主管护师是什么职称| 桦树茸的功效主治什么病| 肌酸激酶偏低说明什么| 肛门胀痛什么原因| 黎明破晓是什么意思| 长寿花用什么肥料最好| 免疫组化是什么意思| 阑尾有什么用| 老什么什么什么| moss是什么意思| 水手是什么意思| 藏青色t恤配什么颜色裤子| 黯然泪下是什么意思| 55年属什么生肖| gl是什么| 梦见孩子拉屎是什么意思| 失眠吃什么药| 血氧低吃什么提高的快| c14阳性 是什么意思| 爷们儿大结局是什么| 鸡蛋不能和什么食物一起吃| 喝最烈的酒下一句是什么| 怀疑肝不好挂什么科室| 戾气什么意思| 尿道痛什么原因| 存货是什么| 眼底出血是什么症状| 伟哥是什么意思| 婚车头车一般用什么车| 来事头疼什么原因| 怀孕可以吃什么| 8.23是什么星座| 什么让我成长| 指压是什么意思| 结肠炎吃什么药好| bps是什么意思| 插入是什么感觉| 酸儿辣女什么意思| 堪舆是什么意思| 小腿发痒是什么原因| 芥末黄是什么颜色| 现在什么年| 5月30日是什么星座| 广菜是什么菜| 为什么会长肉粒| 胎盘是什么| 红薯什么时候种植| atc是什么意思| 有头皮屑用什么洗发水| 粉玫瑰适合送什么人| 庭长是什么级别| 鼠妇是什么| 谢娜人气为什么那么高| 指甲发黄是什么原因| 199是什么意思| 为什么叫中日友好医院| 偷什么不犯法| collection什么牌子| 五月十七是什么星座| 什么是性骚扰| 陕西八大怪是什么| 12月2日什么星座| 扬州有什么特产| 可可是什么饮料| 梦见捡钱是什么意思| 调节肠道菌群吃什么药| 补钾吃什么| 莫西沙星片主治什么病| 也许是什么意思| 养殖什么最赚钱| 为什么会得甲减| 日本桑是什么意思| 下午8点是什么时辰| 依字五行属什么| 香辛料是什么| 吟诗作赋是什么意思| 血小板数目偏高是什么意思| sjb是什么意思| 梦见出血是什么征兆| pr值是什么意思| 早上起床吐痰带血是什么原因| 八项规定的内容是什么| 大白片是什么药| 神器积分换什么最划算| 冰火是什么意思| nadh是什么| 浪琴名匠系列什么档次| 收孕妇尿是干什么用的| 23年属什么生肖| 熊猫为什么会成为国宝| 带刺的玫瑰是什么意思| 蒌蒿是什么| 乳清粉是什么东西| 痛经吃什么药最有效| hsv1是什么病毒| 宝宝体检挂什么科| 什么是静脉曲张| 润滑油可以用什么代替| 宝宝嘴巴臭臭的是什么原因| 真菌感染是什么意思| 胃酸过多吃什么| 贞操锁是什么| 玫瑰糠疹吃什么药最有效| 鳄鱼的天敌是什么| 盆腔积液是什么症状| 做梦梦到乌龟是什么预兆| 做梦梦到自己拉屎是什么意思| 瘦的快是什么原因| 羟丁酸脱氢酶高是什么原因| 身是什么结构的字| 头晕呕吐吃什么药| 中风的人吃什么好| 香蕉和什么不能一起吃| 1947年属什么| 邮箱地址填什么| 不想说话是什么原因| 8月20号什么星座| 什么车最长| 经常挖鼻孔有什么危害| 晚上吃什么最健康| 被和谐了是什么意思| 腰痛宁胶囊为什么要用黄酒送服| 脾脏是人体的什么器官| 宝宝dha什么时候吃最好| 2021是什么年| 抽血化验能查出什么| 两千年前是什么朝代| 鲍鱼长什么样| 肾病综合症是什么病| 球虫病有什么症状| 注明是什么意思| hpv跟tct有什么区别| 白鹭吃什么| 纳豆是什么东西| 腹腔多发淋巴结是什么意思| 什么情况下做肾穿刺| 砂仁后下是什么意思| 纳财是什么意思| 21金维他什么时候吃效果最好| 微尘是什么意思| 女中指戴戒指什么意思| 大腿根部疼痛是什么原因| na医学上是什么意思| doro什么意思| 卡姿兰是什么档次| 员额制是什么意思| 禅心是什么意思| 肚子有水声是什么原因| 别致是什么意思| 什么东西护肝养肝| 心跳过慢吃什么药| 人的三观是什么| 碟鱼头是什么鱼| 1990年1月属什么生肖| 纵容是什么意思| 肠胃不好可以吃什么水果| 梦见种玉米是什么意思| 猿人头是什么牌子| 上岗证是什么| 93什么意思| 胃溃疡有什么症状| 鸟喙是什么意思| 注是什么意思| 五光十色是什么意思| 怀孕前三个月为什么不能告诉别人| 谷维素是什么| 职业年金什么时候领取| 水鱼是什么| 糟卤是什么| 空调外机为什么会滴水| 燕窝补什么| 海粉是什么| 高血压挂号要挂什么科| 暮光是什么意思| 什么检查需要空腹| 4ever是什么意思| 一个火一个羽一个白念什么| 内热是什么原因引起的| 人工肝是什么意思| 圈名什么意思| 来月经吃什么水果| 加速度是什么意思| 10月7日什么星座| 什么叫惊喜| 反应性增生是什么意思| 牛的三合和六个合生肖是什么| 前列腺是什么原因引起的| 为什么叫985大学| 心理是什么意思| 百度
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【重修Python】谈一谈递归

“中国很赞”主题列车开进成都地铁7号线  市民为中国点赞

原创
作者头像
花花Binki
修改于 2025-08-05 19:04:38
修改于 2025-08-05 19:04:38
百度 值得一提的是,苏麦尔此前曾是叙军一名上尉高官,起初叙利亚政府军形势并不明朗的时候,率领手下部队与叙利亚政府军为敌,其手下部队人数多达上万人,摇身一变成为了名副其实的“一方诸侯”。 53000
代码可运行
举报
运行总次数:0
代码可运行
封面
封面

前言

在正式开始前,先来回忆一个问题。

假定一对刚出生的小兔一个月后就能长成大兔,再过一个月便能剩下一对小兔,并且每个月都生一对小兔。一年以内没有发生死亡。那么有一对刚出生的兔子开始,12个月后会有多少对兔子呢?

以上来自小学六年级下册的数学课本。当时老师讲解的方案是找规律。

0月

1月

2月

3月

4月

5月

6月

7月

8月

9月

10月

11月

1

1

2

3

5

8

13

21

34

55

89

144

这也非常著名的斐波那契数列!

直到后来,我们使用数学公式来表达这个问题的解。

f(x)= \begin{cases} 1, x=1 \\ 2, x=2 \\ f(x-1) + f(x-2), x>2 \\ \end{cases}

那现在我们对于这个问题,可以使用自己调自己的函数来解决,如下:

代码语言:python
代码运行次数:0
运行
复制
# 斐波那契数列
def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

如上,就是本文所要谈的话题,专业名词称为递归

什么是递归?

光看上面的公式,不是很直观。

而放在数学学科中,常常以数形结合的方式,所以本文也效仿一下。

斐波那契示例图
斐波那契示例图

当我们想知道第n(n>2)个月兔子的数量,就可以向下一层一层的向下去问,这个过程就叫做"递"。一直"递"到无法再"递"的节点,然后再将结果一层一层汇总,向上“归”。那么我们说这个过程,可以称之为递归

如何写递归

再回到上文案例中,把问题形式和求解过程抽象出来

  • 问题形式:可以拆解成小问题,并且形式与原问题一致。
  • 求解过程:找到那个无需计算的最小问题,作为递归的终止条件,再汇总多个这样的解,得到原问题的解。

理论存在,那么来秒一道求阶乘问题!

代码语言:python
代码运行次数:0
运行
复制
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)
print(factorial(5)) 
#  计算过程 5 * 4 * 3 * 2 * 1 = 120

如何写好递归

谜底就在谜面上,其实只要写出递归,就已经写好了,因为你已经直到了如何拆分这个问题为递归模式。但是还没有完,往往我们递归的问题出在后面的异常超时等问题。

Stack overflow

①当我们终止条件不正确的时候,见下图

错误案例-1
错误案例-1

如果上述阶乘的案例中,不小心将-错写成了+。那么势必会进入无法终止的条件,导致报错。


②除此之外,还有一种情况,即使你写好了终止条件,但是因为n过大,导致循环次数过多,也会出现上述的情况,或者计算时间很长。拿常规的斐波那契写法举例(见前言中的案例),如果n设置为100,那么你将会看到控制台像卡住一样得不到结果(你需要进行大约 1.67 亿次递归调用)。

解决方案

对于①的情况,往往需要你重新设计算法,或debug检查变量的值(debug的方法见本文结尾)。

而情况②,则需要算法中常用的一种方法:剪枝。

仔细分析此案例中的递归,当n为5时,我们大概需要1次重复运算,就是f(3);而当n到6时,重复计算的次数来到了5次。

所以,如果我们将计算结果缓存起来,每次先去缓存里看有没有计算过,这样,我们像减去“递归”树的枝叶一样,节省了资源。具体代码如下:

代码语言:python
代码运行次数:0
运行
复制
from functools import lru_cache
import time

@lru_cache(maxsize=None)
def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n - 1) + fibonacci(n - 2)

# 测试 运行时间
start = time.time()
print(fibonacci(100))  # 输出: 354224848179261915075
end = time.time()
print(end - start)

在这个例子中,我们使用了 functools 模块中的 lru_cache 装饰器来为 fibonacci 函数提供缓存。maxsize=None 表示缓存的大小没有限制。这将缓存所有已计算的斐波那契数,从而减少时间复杂度。

请注意,这种方法在计算大的斐波那契数时可能会消耗大量内存。你可以通过设置 maxsize 参数来限制缓存的大小。

递归的应用

递归只能来解数学题?上面两个案例中,我都是用来解决数学中的问题。不过只是为了省去其他学习门槛,接下来,看一看编程中实际的应用。

树的遍历

完整代码:

代码语言:python
代码运行次数:0
运行
复制
# 定义二叉树
class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

# 测试数据
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)

# 先序遍历
def preOrder(root):
    if root is None:
        return
    print(root.data, end=' ')
    preOrder(root.left)
    preOrder(root.right)
    
# 执行
preOrder(root) # 输出:1 2 4 5 3 

树的结构就是对递归最好的诠释。

  • 文体形式:每个节点都有0~2个子节点。
  • 终止条件:只需要判断当前节点不为none即可。

可见下图看结果

测试数据图例
测试数据图例

扩展

怎样debug递归代码

如果自己一步一步的查看代码显然是不现实的,那么正确的debug递归代码,应该采取以下方案:

  • 适量输出log 当问题出现在递归代码时,我们应该对于一些关键变量输出,甚至可以加一些格式使过程更直观。
  • 减少问题规模 一般出问题的情况都是终止条件的问题,所以,将输入尽量减小数据,或分批测试出异常case。
  • 采取非递归 有很多时候,可以将递归写法改为非递归,回到阶乘案例,可以进行循环计算
代码语言:python
代码运行次数:0
运行
复制
def factorial(n):
    result = 1
    for i in range(1, n+1):
        result *= i
    return result
print(factorial(10))  # 结果:3628800

控制递归深度

代码语言:python
代码运行次数:0
运行
复制
import sys

sys.setrecursionlimit(50)

总结

递归凭借着简洁的语法得到极大的关注,但是想要写好递归还是需要一定经验的。希望本文对你有所帮助。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 什么是递归?
  • 如何写递归
  • 如何写好递归
    • Stack overflow
    • 解决方案
  • 递归的应用
    • 树的遍历
  • 扩展
    • 怎样debug递归代码
    • 控制递归深度
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
上火牙齿痛吃什么药 雾里看花是什么意思 ur品牌属于什么档次 18年是什么年 09年的牛是什么命
大象吃什么食物 睡觉后脑勺出汗多是什么原因 为什么嗜睡 猪血炒什么好吃 贡眉是什么茶
灵芝长什么样子 玉米吃多了有什么坏处 肠炎吃什么好 豚鼠吃什么食物 什么是气虚
杯弓蛇影的寓意是什么 护照类型p是什么意思 人流后吃什么恢复快 simon什么意思 肾虚和肾亏有什么区别
胃溃疡吃什么药好得快bfb118.com 手指甲有黑色条纹是什么原因hcv9jop2ns2r.cn 08年属什么生肖hcv9jop6ns1r.cn 痔疮是什么症状hcv9jop5ns9r.cn 细胞是什么hcv8jop6ns9r.cn
腥臭味是什么妇科病hcv8jop7ns8r.cn vk是什么hcv9jop3ns5r.cn 脊髓病变是什么病hcv8jop4ns2r.cn 淋巴细胞比率偏高是什么原因hcv9jop4ns9r.cn 乌鸡汤放什么补气补血hcv8jop1ns6r.cn
看腋下挂什么科liaochangning.com 层峦叠翠的意思是什么hcv9jop2ns3r.cn dbp是什么意思hcv9jop6ns4r.cn 大人发烧吃什么药gangsutong.com 排骨是什么肉hcv9jop3ns0r.cn
总胆红素高是怎么回事有什么危害520myf.com 琅玕是什么意思hcv8jop2ns8r.cn 慢性胃炎吃什么药效果好hcv8jop8ns1r.cn 浆水是什么hcv8jop9ns3r.cn 食物中毒用什么药hcv9jop4ns5r.cn
百度