[英]Write a recursive function to solve Fibonacci
我想用 Python 为斐波那契写一个递归函数。
x
将是起点, y
将是x
的后续点, l
是长度。
我不明白我的思维错误是什么:
def fib(x, y, l, fibList=None):
fibList = []
z = x + y
x = y
fibList.append(z)
y = z
if len(fibList) <= l:
return fib(x, y, l, fibList)
else:
return(fibList)
结果是:
RecursionError: maximum recursion depth exceeded while calling a Python object
我可以用 for 循环解决它,但不能用递归函数解决。
这里有几个问题。 一旦你修复了无限递归,你仍然有问题。
正如@Raqha 指出的那样,您不需要在每次调用fib
函数时初始化您的列表,而只是在第一次未提供fibList
参数时初始化您的列表,因此默认为None
。
您的代码无法生成序列中的前两个数字0
和1
。 您可以通过简单地初始化列表以包含这些术语来解决此问题,并调整逻辑以仅提供 N-2 个更多的术语。
可以改进函数的签名,使调用者更容易使用它。 调用者只关心他/她想要的术语数量。 用户不必知道为初始x
和y
值输入什么。
这是您的代码版本,其中修复了无限递归,修复了缺失项,并且还重新排列了签名,以便用户可以简单明了地调用该函数:
def fib(l, x=0, y=1, fibList=None):
if fibList is None:
fibList = [0, 1]
z = x + y
x = y
fibList.append(z)
y = z
if len(fibList) < l-1:
return fib(l, x, y, fibList)
else:
return(fibList)
print(fib(10))
结果:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
在每个fib
函数调用开始时,您使用fibList = []
清除fibList
。 因此列表的长度将始终为<= 1
,因此您会遇到一个不好的无限递归循环。 您需要添加类似if fibList is None:
当您第一次调用函数“fib”而不在参数列表中提供任何第 4 条语句时,fibList 的值最初将设置为“None”。 但是稍后当您再次递归调用函数“fib”时,您在参数列表中提供了一个 fibList。 所以值不再是“无”。 因此,当如上所述添加 if 语句时,该函数知道何时从外部调用该函数(当您在代码中将其称为“fib(1,2,10)”时),或者该函数何时递归调用自身. 因此,每次调用该函数时都不会重置 fibList,而是在开始时仅设置 1 次。
def fib(x, y, l, fibList=None):
if fibList is None:
fibList = []
z = x + y
...
在第二行设置fibList = []
。 这意味着每次递归调用该函数时,它会将列表重置为空,因此len(fibList)
将始终等于 1。
删除该行,以便 fibList 变量不会被重置,然后它应该正确地达到您的退出条件。 现在它是如何编写的,它会一直运行,直到损坏为止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.