繁体   English   中英

写一个递归函数来求解斐波那契

[英]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

您的代码无法生成序列中的前两个数字01 您可以通过简单地初始化列表以包含这些术语来解决此问题,并调整逻辑以仅提供 N-2 个更多的术语。

可以改进函数的签名,使调用者更容易使用它。 调用者只关心他/她想要的术语数量。 用户不必知道为初始xy值输入什么。

这是您的代码版本,其中修复了无限递归,修复了缺失项,并且还重新排列了签名,以便用户可以简单明了地调用该函数:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM