python 新版 49 课后习题
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是什么意义呢?
问题解答:Python 尾递归 Fibonacci 函数中的 x 和 y 参数含义
在尾递归版本的 Fibonacci 函数中,`x` 和 `y` 参数是为了在递归调用中保存中间结果,避免重复计算,优化性能。
[*]x:表示当前第 n-2 项的值。
[*]y:表示当前第 n-1 项的值。
在递归过程中,`x` 和 `y` 会不断向前推进,相当于“传递”了 Fibonacci 数列中相邻两项的值。到最后,当递归结束时(n == 1 或 n == 2),`y` 就是所求的 Fibonacci 第 n 项。
例子解析:tailFibRecur(12, 1, 1)
[*]初始调用:tailFibRecur(12, 1, 1),其中 `x=1`、`y=1`(Fibonacci 数列前两项)。
[*]第一次递归:tailFibRecur(11, 1, 2),把前两项 x=1 和 y=2 传递下去。
[*]第二次递归:tailFibRecur(10, 2, 3),这里 x=2、y=3。
[*]重复这个过程,直到 n == 2,返回 y=144(Fibonacci 第 12 项的值)。
总结:尾递归版本通过传递 x 和 y 减少了重复计算,使得时间复杂度更优(转为线性复杂度)。
如果还有疑问,可以随时提出来哦! :smile:
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 这个函数是在模拟斐波那契数列的计算过程,x,y是函数的两个参数,也是斐波那契数列数列的初始值。
x用于辅助计算y的值,y的值在每次递归时会更新 假设初始时传入了错误的参数,比如
传入 x=2, y=3 时
那么结果不就错了么?
这不是反而更乱了? gainer 发表于 2025-1-24 21:56
假设初始时传入了错误的参数,比如
传入 x=2, y=3 时
那么结果不就错了么?
x 和 y 在递归的每一步中代表了两个相邻的斐波那契数。
这种方式避免了在每一层递归中重复计算已经计算过的值,从而提高了效率,并且使用尾递归来优化内存使用。 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)
页:
[1]