鱼C论坛

 找回密码
 立即注册
查看: 101|回复: 5

[已解决]关于斐波那契数列/while循环/函数,为什么这个函数的结果会是144

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

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

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

x
B站第50讲了,在学递归函数。里面的一个函数不是很理解,来请教大家。
按照我的理解,当n>2的时候, c = a + b. 在while循环里面, n的取值先后为12, 11, 10......3。c=a + b,因为a和b的初始值都是1, 那么c的初始值就是2。从n=3算起,当n=9的时候c就已经是128了,但是最终结果为什么是144呢?谢谢大家!

代码如下:
>>> def fiberIter(n):
...     a = 1
...     b = 1
...     c = 1
...     while n > 2:
...         c = a + b
...         a = b
...         b = c
...         n -= 1
...     return c
... 
>>> fiberIter(12)
144

最佳答案
2024-8-9 18:42:09
n=12时,c=2,a=1,b=2,n自减1
n=11时,c=3,a=2,b=3,(因为先执行的c=a+b语句,这时a等于1,b等于2)
n=11,c=5,a=3,b=5
以此类推……
…………(省略)
n=3时,c=144,a=89,b=144

建议你像这样先举几个例子,让n值为5,自己再算算就明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-9 18:03:31 | 显示全部楼层
哈哈,欢迎来到“斐波那契的神秘之旅”!别担心,让我用通俗易懂的语言把这个函数讲清楚。

首先,斐波那契数列的定义是这样的:从第三个数开始,每个数都是前两个数之和。也就是说,F(1) = 1, F(2) = 1, F(3) = 1 + 1 = 2, F(4) = 1 + 2 = 3, F(5) = 2 + 3 = 5……以此类推。

现在,我们来看你的代码:
def fiberIter(n):
    a = 1  # F(1)
    b = 1  # F(2)
    c = 1  # F(3)
    while n > 2:
        c = a + b  # c = F(n) = F(n-1) + F(n-2)
        a = b      # 更新 a 为 b,即对应到下一个数
        b = c      # 更新 b 为 c,准备计算下一个数
        n -= 1     # 每次循环减少计算的数字
    return c

### 解析过程:

1. 初始化时,`a` 和 `b` 都是1(即F(1)和F(2)),`c` 也设置为1(将来会被更新为 F(3))。
2. 当`n`大于2时,循环开始:
   - 第一次循环:`c = a + b = 1 + 1 = 2` (即F(3)),接着`a`变为1,`b`变为2。
   - 第二次循环:`c = a + b = 1 + 2 = 3` (即F(4)),接着`a`变为2,`b`变为3。
   - 第三次循环:`c = a + b = 2 + 3 = 5` (即F(5)),接着`a`变为3,`b`变为5。
   - 依此类推,直到`n`减到2。

### 为什么最后结果是144?

当你调用`fiberIter(12)`时,函数会在循环中进行如下计算:

- F(3) = 2
- F(4) = 3
- F(5) = 5
- F(6) = 8
- F(7) = 13
- F(8) = 21
- F(9) = 34
- F(10) = 55
- F(11) = 89
- F(12) = 144

最终,`c`在`n`减到2的时候就达到了144,这就是F(12)。

所以,你追溯到`n=3`的计算时,确实会感觉到混淆,但实际上它是一直在按照斐波那契的规则在算的!希望这些解释让你更清楚斐波那契数列的奥秘了!如果还有什么问题,随时问我哦!

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

使用道具 举报

发表于 2024-8-9 18:42:09 | 显示全部楼层    本楼为最佳答案   
n=12时,c=2,a=1,b=2,n自减1
n=11时,c=3,a=2,b=3,(因为先执行的c=a+b语句,这时a等于1,b等于2)
n=11,c=5,a=3,b=5
以此类推……
…………(省略)
n=3时,c=144,a=89,b=144

建议你像这样先举几个例子,让n值为5,自己再算算就明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-9 22:34:28 | 显示全部楼层
本帖最后由 jackz007 于 2024-8-9 22:43 编辑
def fiberIter(n):
    x , e = [] , 0
    for k in range(n) :
        if k < 2 :
            x . append(e)
            e += 1    
        else :
            x . append(x[k - 2] + x[k - 1])
    return x

fiberIter(12)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
     斐波那契数列的第 1、2 项是 0,1。144 是第 13 项的值(55 + 89 = 144)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-9 23:05:28 | 显示全部楼层
三体人的智子 发表于 2024-8-9 18:42
n=12时,c=2,a=1,b=2,n自减1
n=11时,c=3,a=2,b=3,(因为先执行的c=a+b语句,这时a等于1,b等于2)
n=11,c= ...

好的,非常感谢。虽然还没有完全明白,但是大概的思路有了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-9 23:07:01 | 显示全部楼层
jackz007 发表于 2024-8-9 22:34
斐波那契数列的第 1、2 项是 0,1。144 是第 13 项的值(55 + 89 = 144)。

好的,非常感谢,您提供了另外一个思路,虽然看不大懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-17 02:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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