鱼C论坛

 找回密码
 立即注册
查看: 100|回复: 3

[学习笔记] 50讲,斐波那契数列/递归函数运算过程

[复制链接]
发表于 2024-8-9 23:36:27 | 显示全部楼层 |阅读模式

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

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

x
到了50讲了,关于递归和斐波那契数列。小甲鱼用迭代和递归的方式讲解了斐波那契数列,都不大懂。在论坛求助后大概明白了那个迭代函数,现在我自己做一下递归函数的笔记,虽然都不大懂,但是好歹思路通了。

函数代码如下:
>>> def fiberRecur(n):
...     if n == 1 or n == 2:
...         return 1
...     else:
...         return fiberRecur(n-1) + fiberRecur(n-2)
... 
...     
>>> fiberRecur(12)
144

解析如下:
当我们调用 FiberRecur(12) 时,该函数会分解为更小的递归调用:
FiberRecur(12) 需要 FiberRecur(11) 和 FiberRecur(10)
FiberRecur(11) 需要 FiberRecur(10) 和 FiberRecur(9)
FiberRecur(10) 需要 FiberRecur(9) 和 FiberRecur(8)
FiberRecur(9) 需要 FiberRecur(8) 和 FiberRecur(7)
FiberRecur(8) 需要 FiberRecur(7) 和 FiberRecur(6)
FiberRecur(7) 需要 FiberRecur(6) 和 FiberRecur(5)
FiberRecur(6) 需要 FiberRecur(5) 和 FiberRecur(4)
FiberRecur(5) 需要 FiberRecur(4) 和 FiberRecur(3)
FiberRecur(4) 需要 FiberRecur(3) 和 FiberRecur(2)
FiberRecur(3) 需要 FiberRecur(2) 和 FiberRecur(1)
FiberRecur(2) 和 FiberRecur(1) 生成的结果是 1。

从下往上计算数值:
FiberRecur(1) = 1
FiberRecur(2) = 1
FiberRecur(3) = FiberRecur(2) + FiberRecur(1) = 1 + 1 = 2
FiberRecur(4) = FiberRecur(3) + FiberRecur(2) = 2 + 1 = 3
FiberRecur(5) = FiberRecur(4) + FiberRecur(3) = 3 + 2 = 5
FiberRecur(6) = FiberRecur(5) + FiberRecur(4) = 5 + 3 = 8
FiberRecur(7) = FiberRecur(6) + FiberRecur(5) = 8 + 5 = 13
FiberRecur(8) = FiberRecur(7) + FiberRecur(6) = 13 + 8 = 21
FiberRecur(9) = FiberRecur(8) + FiberRecur(7) = 21 + 13 = 34
FiberRecur(10) = FiberRecur(9) + FiberRecur(8) = 34 + 21 = 55
FiberRecur(11) = FiberRecur(10) + FiberRecur(9) = 55 + 34 = 89
FiberRecur(12) = FiberRecur(11) + FiberRecur(10) = 89 + 55 = 144
因此,fibreRecur(12) 生成的值为 144。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-9 23:37:41 | 显示全部楼层
哎呀,小伙伴,看来你对递归和斐波那契数列已经有了一定的理解,真是太棒了!不过,咱们来把这个过程再简单幽默地捋一捋,让大家都能轻松掌握!

首先,斐波那契数列就像是一场家庭聚会,爷爷(F(1))和奶奶(F(2))都来参加,他们都有1个小孩。接下来,家庭聚会的人数就会像斐波那契数列一样增长:每次新生的小孩都是由他俩的孩子组合而成(也就是前面两个孩子的数量相加)。所以,想要知道第n个孩子有多少人,就要去找他们前面的两个孩子一起“凑份子”。

### 递归的思路
在你的代码中:
def fiberRecur(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fiberRecur(n-1) + fiberRecur(n-2)
这段代码就像是一个非常热情的“聚会策划者”。每当你问他第n个孩子的数量,他就会说:“让我去问问第(n-1)个和第(n-2)个孩子。” 然后继续这样询问下去,直到问到1号和2号孩子(他们都是1个)。

### 分解过程
调用 `fiberRecur(12)` 就好比你在派对上找一个特别的12号孩子,结果发现为了找到这个小家伙,你得先看看11号和10号是怎么说的;然后11号又回去找10号和9号……这就像打开了一层层的洋葱,每一层都是对更小问题的追问,直到找到最基本的答案(1和1)。

### 从下往上计算
然后你就开始从小孩的回答往上算:
- F(2) = 1
- F(3) = F(2) + F(1) = 1 + 1 = 2
- F(4) = F(3) + F(2) = 2 + 1 = 3
- ……

一直到你终于算出F(12)的值,144,哇塞,12号孩子长得可真不错!

### 性能考虑
但是有一个问题,每次你问孩子的数量,都会回去问前面的孩子,这样反复询问会导致很多重复计算(就像派对上,大家一直问“你见过几号吗?”,造成信息混乱)。如果想提高效率,可以考虑使用迭代方法或者记忆化递归,这样就不会每次都重复询问啦。

总之,递归就像是一场愉快的聚会,而斐波那契数列则是在这个聚会上快速成长的小朋友们。希望你可以像斐波那契数列一样,越来越聪明,越来越好玩!加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-10 10:41:04 | 显示全部楼层
FishC 发表于 2024-8-9 23:37
哎呀,小伙伴,看来你对递归和斐波那契数列已经有了一定的理解,真是太棒了!不过,咱们来把这个过程再简单 ...

哎呀,谢谢小助理的回复,真贴心!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-10 21:42:27 | 显示全部楼层
本帖最后由 jackz007 于 2024-8-10 22:15 编辑

         递归是一个函数不断调用自己的过程,一个递归函数必须要设置递归终点,否则,递归太深会因为堆栈耗尽而导致运行错误。
         递归终点一般是通过函数的输入参数来进行控制,在递归过程中,输入参数必须朝一个固定方向进行变化,根据情况可以选择i逐渐减小或者增大,当变化达到一定的数值时,递归终止。
         以本例为例,输入参数 n 在递归中是逐渐减小的过程,当 n 大于 2 的时候,会继续递归,否则,当 n = 1 或 n = 2 的时候,递归到达终点,开始进入返回过程,并逐级执行递归调用语句后面的语句,直到递归调用全部返回。
         考察、运行一下这个代码可能会有助于加深对递归函数的理解
def recurse(n , c):
    if c < 11:
        print('第【%2d】层:进入 n = %3d' % (c , n))   # 进入过程执行
        recurse(n + 1 , c + 1)                         # 递归
        print('第【%2d】层:退出 n = %3d' % (c , n))   # 退出过程执行
    else :
        print('  【终点】:c = %2d , n = %3d' % (c , n)) # 递归终点

recurse(33 , 0)
        运行实况:
D:\[exercise]\Python>python recurse.py
第【 0】层:进入 n =  33
第【 1】层:进入 n =  34
第【 2】层:进入 n =  35
第【 3】层:进入 n =  36
第【 4】层:进入 n =  37
第【 5】层:进入 n =  38
第【 6】层:进入 n =  39
第【 7】层:进入 n =  40
第【 8】层:进入 n =  41
第【 9】层:进入 n =  42
第【10】层:进入 n =  43
  【终点】:c = 11 , n =  44
第【10】层:退出 n =  43
第【 9】层:退出 n =  42
第【 8】层:退出 n =  41
第【 7】层:退出 n =  40
第【 6】层:退出 n =  39
第【 5】层:退出 n =  38
第【 4】层:退出 n =  37
第【 3】层:退出 n =  36
第【 2】层:退出 n =  35
第【 1】层:退出 n =  34
第【 0】层:退出 n =  33

D:\[exercise]\Python>
         
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-17 03:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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