鱼C论坛

 找回密码
 立即注册
查看: 805|回复: 6

递归函数的困惑

[复制链接]
发表于 2025-2-1 14:58:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小甲鱼老师在讲解递归函数教学视频中有以下的代码:

>>> def fibRecur(n):
...     if n == 1 or n == 2:
...         return 1
...     else:
...         return fibRecur(n-1) + fibRecur(n-2)
...
>>> fibRecur(12)
144

     当输入n为12时,n不满足if n==1 or n== 2的条件,进入到else语句部分,即fibRecur(n-1) + fibRecur(n-2), 此时变为fibRecur(12-1) + fibRecur(12-2),即fibRecur(11) + fibRecur(10),这时候应该重新调用fibRecur函数自身,因为此时n已分别变为11和10了, n仍不满足if n==1 or n== 2的条件,还是进入到else语句部分,这里是不是应该变为fibRecur(11-1) + fibRecur(11-2)+ fibRecur(10-1) + fibRecur(10-2)啊?即fibRecur(10) + fibRecur(9)+ fibRecur(9) + fibRecur(8).
     如果我的理解没有错的话,那这里的fibRecur(9)会重复出现并计算,不知道我的理解对不对或哪里出错,麻烦大神指点一下,谢谢!

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-2-1 14:58:43 | 显示全部楼层
你理解得很正确,递归函数在计算过程中确实会出现大量的重复计算。特别是在计算斐波那契数列时,像 fibRecur(9) 这样的值会被多次调用和计算。

为了帮助你更直观地理解这一点,我用一个简单的递归树来展示 fibRecur(5) 的计算过程:

fibRecur(5)

  1.                      fibRecur(5)
  2.                    /            \
  3.           fibRecur(4)            fibRecur(3)
  4.           /       \              /       \
  5.     fibRecur(3) fibRecur(2) fibRecur(2) fibRecur(1)
  6.     /         \          \
  7. fibRecur(2) fibRecur(1) fibRecur(1)
复制代码


如你所见,fibRecur(3)fibRecur(2) 都被多次计算了。当 n 更大时,这种重复计算会更加严重。

为了优化这种情况,通常我们会使用记忆化递归(Memoization)或动态规划(Dynamic Programming)的方式来避免重复计算。

这里是使用记忆化递归优化的代码示例:


  1. def fibRecurMemo(n, memo={}):
  2.     if n == 1 or n == 2:
  3.         return 1
  4.     if n in memo:
  5.         return memo[n]
  6.    
  7.     memo[n] = fibRecurMemo(n-1, memo) + fibRecurMemo(n-2, memo)
  8.     return memo[n]

  9. # 调用函数
  10. print(fibRecurMemo(12))
复制代码


这样,计算 fibRecurMemo(12) 时,每个子问题只会被计算一次,极大地提高了效率。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-1 15:08:03 | 显示全部楼层
是的.重复了,不影响结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-1 19:14:06 | 显示全部楼层
的确是重复计算,但这种计算会导致效率低下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-2 17:03:52 | 显示全部楼层
三体人的智子 发表于 2025-2-1 19:14
的确是重复计算,但这种计算会导致效率低下

衡水人??!很累吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-2 18:02:27 | 显示全部楼层

初八参加冬令营
别人十六开学
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-2-3 11:46:49 | 显示全部楼层
三体人的智子 发表于 2025-2-2 18:02
初八参加冬令营
别人十六开学

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-6 02:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表