鱼C论坛

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

斐波那契数列之小兔崽子的疑问

[复制链接]
发表于 2023-6-15 01:14:01 | 显示全部楼层 |阅读模式

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

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

x
1、以下注释是否正确
2、多处???请解疑释惑,不甚感谢


'''
n :表示月数
n1:表示???
n2:表示???
n3:表示???
'''

def fab(n): # 为何需要定义下面三个变量?而且还都必须等于1?
    n1 = 1 # 第1个月总对数为1
    n2 = 1 # 第2个月总对数为1
    n3 = 1 # 第3个月总对数默认初始值先为1?若无此行代码当fab(1)或fab(2)时会报错!
    # 上面也可写成n1 = n2 = n3 = 1

    if n < 1:
        print('输入有误!') # 若输入的值(即月数)小于1则报错,比如输入0毫无意义,输出错误提示
        return -1 # 注意此行缩进!报错就return -1(正常情况下把结果return回去),可否返回其他数值?

    while (n - 2) > 0: # 为何设置这个条件,而且必须n - 2 且必须>0?
        n3 = n1 + n2 # 等于左边两个月总对数的和---从头开始计算,依次递进!
        n1 = n2 # ……?---(n - 2)从左往右递进!
        n2 = n3 # ……?---(n - 1)从左往右递进!
        n -= 1 # 循环次数减1---循环次数从多到少!
   
    # 当(n - 2) == 0时不再执行循环/退出循环
    return n3 # 注意此行缩进!返回结果即最后一轮循环时n3的值


result = fab(20) # 调用函数fab(n),20个月作为参数传入,将结果赋值给变量result
if result != -1: # 当result的值不等于-1时,等于-1就说明报错了,为何需要这个条件?
    #print('20个月总共有%d对小兔子!' % result)
    print(f'20个月总共有{result}对小兔子!') # 输出总对数


#number = int(input('请输入月数:'))
#result = fab(number)
#if result != -1:
    #print('%d个月总共有%d对小兔子!' % (number, result))
    #print(f'{number}个月总共有{result}对小兔子!' )
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-15 04:24:27 | 显示全部楼层
1,关于注释的正确性,大部分都是正确的,只有第一个变量n,注释中提到它表示"月数",实际上表示的应该是斐波那契数列的项数,因为在这个代码中,n的值代表求解斐波那契数列的第n项。

为了更好地解答你的问题,我按照代码中的逻辑顺序一一回答。

在函数fab(n)中,需要定义下面三个变量n1、n2、n3,是因为这个代码是用来求解斐波那契数列的,每一项的值都是由前两项相加得到的,所以需要定义n1和n2分别表示斐波那契数列中的第1项和第2项,而n3则表示斐波那契数列中的第3项,作为迭代时的初始值。
在三个变量的定义中,都必须等于1,是因为斐波那契数列的前两项都是1,后面的项由前面两项相加产生。
n3表示第3个月总对数的默认初始值先设为1,是因为当n的值小于3时,需要这个默认初始值,否则,计算第3项的时候会出错。例如,计算fab(2)时需要使用n1和n2的值,n1和n2的值都是1,但计算fab(3)时,n3的值应该等于2而不是1,所以需要将n3的默认初始值设为1。
在输入的月数n小于1的情况下,程序会输出"输入有误!"的错误提示,并通过return -1这个语句通知调用函数的程序,返回-1。这里return的值可以是其他数字,视具体情况而定。
循环的条件是:当(n - 2) >0时,也就是当剩余的斐波那契数列项数大于2时,进入循环。为什么要保证剩余的项数大于2呢?因为已经定义了n1和n2分别表示斐波那契数列中的第1项和第2项,所以当n的值小于等于2的时候,前两项已经确定了,不需要再进行迭代计算。
循环体中的三行语句实现了斐波那契数列的迭代计算,其中n3 = n1 + n2表示的是斐波那契数列中的每一项都由前两项相加得到,n1 = n2是为了在下一轮迭代中,n2可以作为前一项,n3可以作为当前项,n -= 1是为了在每一次迭代结束后,更新剩余的斐波那契数列项数,确保循环的停止条件得到满足。
在最后一轮迭代结束后,返回n3作为函数值,即斐波那契数列中的第n项的值。
在调用函数fab(n)之后,需要对函数的返回值进行判断,如果返回的值为-1,则表明输入有误,不能计算斐波那契数列的第n项,输出错误信息。否则,输出斐波那契数列的第20项的值。
这段代码的注释比较详细,但是有些地方可能写得不够清楚,容易让人产生疑惑。希望我的解答能够帮助你理清代码的逻辑,如还有疑问,请随时提出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-15 07:58:45 | 显示全部楼层
该代码的功能是用来计算斐波那契数列,也就是经典的兔子生长问题。每个月的兔子对数是前两个月兔子对数之和。这个问题的前提假设是每对成熟的兔子每个月都会生一对兔子,并且新出生的兔子需要一个月的时间才能成熟。

现在,让我们解答你的疑问:
n:表示月数
n1:表示两个月之前的兔子对数
n2:表示一个月之前的兔子对数
n3:表示当前月份的兔子对数

函数中, n1 , n2 , n3 都被初始化为1,这是因为在兔子生长问题中,斐波那契数列的前两个数是1。

关于 if n < 1 部分,代码的目的是防止输入不合理的值。在这个问题中, n 代表的月数不应该小于1。

while (n - 2) > 0 这个循环的条件是为了计算第n个月的兔子总对数,所以需要执行n-2次循环。

n3 = n1 + n2 ,这是斐波那契数列的定义,每个数是前两个数的和。

n1 = n2 和 n2 = n3 这两行代码是为了更新斐波那契数列的两个相邻的项。

n -= 1 ,这是因为每次循环后,我们都向前推进一个月,所以月数需要减1。

return n3 的意义是返回计算的结果,也就是第n个月的兔子对数。

if result != -1 这个判断是为了检查函数是否因输入不合理的值(月数小于1)而返回错误结果-1,如果不是-1,那么就打印兔子对数。

你看到的代码注释都是合理的,希望这个解答能帮到你。如果你有其他的问题,欢迎继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-15 09:18:52 | 显示全部楼层
本帖最后由 lzb1001 于 2023-6-15 11:20 编辑
青出于蓝 发表于 2023-6-15 04:24
1,关于注释的正确性,大部分都是正确的,只有第一个变量n,注释中提到它表示"月数",实际上表示的应该是斐 ...


……在调用函数fab(n)之后,需要对函数的返回值进行判断,若返回值为-1则表明输入有误,不能计算斐波那契数列的第n项,输出错误信息。否则,正常输出斐波那契数列的第20项的值。


我觉得红色字体应删除:

……在调用函数fab(n)之后,需要对函数的返回值进行判断,若返回值为-1则表明输入有误,不能计算斐波那契数列的第n项,输出错误信息。否则,正常输出斐波那契数列的第20项的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 19:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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