鱼C论坛

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

[已解决]python 新版 49 课后习题

[复制链接]
发表于 2025-1-24 19:48:48 | 显示全部楼层 |阅读模式

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

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

x
def fibRecur(n):
     if n == 1 or n == 2:
         return 1
     else:
         return fibRecur(n-1) + fibRecur(n-2)
原先的函数中,只有一个n,还比较好理解,


def tailFibRecur(n, x, y):
     if n == 1 or n == 2:
         return y
     else:
         return tailFibRecur(n-1, y, x+y)

tailFibRecur(12, 1, 1)

这里为什么要有个x 和 y两个参数,x和y是什么意义呢?
最佳答案
2025-1-27 19:20:24
gainer 发表于 2025-1-24 21:56
假设初始时传入了错误的参数,比如
传入 x=2, y=3 时
那么结果不就错了么?
def tailFibRecur(n, x, y):
这里面的 x 指前一项, y 指当前项。
return tailFibRecur(n-1, y, x+y)
这里面将当前项 y 和下一项 x+y 分别作为新的 x 和 y 进行计算
举个例子:tailFibRecur(12, 1, 1)
n0 = 12, x0 = 1, y0 = 1
递归后传进的参数分别是:
n1 = 11, x1 = 1, y1 = 2
n2 = 10, x2 = 2, y2 = 3
n3 = 9  , x3 = 3, y3 = 5
n4 = 8  , x4 = 5, y4 = 8

函数要求初始要传入正确的参数,否则不会输出正确的结果。
可以改进这个函数,比如给参数指定默认值。这样初始时不必传入 x 和 y ,只需传入 n 即可
def tailFibRecur(n, x=1, y=1):
     if n == 1 or n == 2:
         return y
     else:
         return tailFibRecur(n-1, y, x+y)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-1-24 19:48:59 | 显示全部楼层
问题解答:Python 尾递归 Fibonacci 函数中的 x 和 y 参数含义

在尾递归版本的 Fibonacci 函数中,`x` 和 `y` 参数是为了在递归调用中保存中间结果,避免重复计算,优化性能。

  • x:表示当前第 n-2 项的值。
  • y:表示当前第 n-1 项的值。


在递归过程中,`x` 和 `y` 会不断向前推进,相当于“传递”了 Fibonacci 数列中相邻两项的值。到最后,当递归结束时(n == 1n == 2),`y` 就是所求的 Fibonacci 第 n 项。

例子解析:tailFibRecur(12, 1, 1)
  • 初始调用:tailFibRecur(12, 1, 1),其中 `x=1`、`y=1`(Fibonacci 数列前两项)。
  • 第一次递归:tailFibRecur(11, 1, 2),把前两项 x=1y=2 传递下去。
  • 第二次递归:tailFibRecur(10, 2, 3),这里 x=2y=3
  • 重复这个过程,直到 n == 2,返回 y=144(Fibonacci 第 12 项的值)。


总结:尾递归版本通过传递 x 和 y 减少了重复计算,使得时间复杂度更优(转为线性复杂度)。

如果还有疑问,可以随时提出来哦! :smile:

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

使用道具 举报

发表于 2025-1-24 21:15:27 | 显示全部楼层
这个函数是在模拟斐波那契数列的计算过程,x,y是函数的两个参数,也是斐波那契数列数列的初始值。

x用于辅助计算y的值,y的值在每次递归时会更新
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-1-24 21:56:22 | 显示全部楼层
假设初始时传入了错误的参数,比如
传入 x=2, y=3 时
那么结果不就错了么?
这不是反而更乱了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-1-25 14:48:46 | 显示全部楼层
gainer 发表于 2025-1-24 21:56
假设初始时传入了错误的参数,比如
传入 x=2, y=3 时
那么结果不就错了么?

x 和 y 在递归的每一步中代表了两个相邻的斐波那契数。
这种方式避免了在每一层递归中重复计算已经计算过的值,从而提高了效率,并且使用尾递归来优化内存使用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-1-27 19:20:24 | 显示全部楼层    本楼为最佳答案   
gainer 发表于 2025-1-24 21:56
假设初始时传入了错误的参数,比如
传入 x=2, y=3 时
那么结果不就错了么?
def tailFibRecur(n, x, y):
这里面的 x 指前一项, y 指当前项。
return tailFibRecur(n-1, y, x+y)
这里面将当前项 y 和下一项 x+y 分别作为新的 x 和 y 进行计算
举个例子:tailFibRecur(12, 1, 1)
n0 = 12, x0 = 1, y0 = 1
递归后传进的参数分别是:
n1 = 11, x1 = 1, y1 = 2
n2 = 10, x2 = 2, y2 = 3
n3 = 9  , x3 = 3, y3 = 5
n4 = 8  , x4 = 5, y4 = 8

函数要求初始要传入正确的参数,否则不会输出正确的结果。
可以改进这个函数,比如给参数指定默认值。这样初始时不必传入 x 和 y ,只需传入 n 即可
def tailFibRecur(n, x=1, y=1):
     if n == 1 or n == 2:
         return y
     else:
         return tailFibRecur(n-1, y, x+y)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-24 02:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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