Python Fibonacci序列错误

时间:2016-04-24 19:30:29

标签: python

这是我在MyProgrammingLab中分配的问题之一。我已尝试超过45次回答此问题,但无法做到正确。 任何帮助将不胜感激

问题: 在以下序列中,每个数字(前两个除外)是前两个数字的总和:0,1,1,2,3,5,8,13 ......这个序列称为Fibonacci序列

我们说的是序列的第i个元素(从0开始) - 因此第0个元素是0,第1个元素是1,第2个元素是1,第3个元素是2,依此类推。给定正整数n,将斐波那契序列的第n个值与变量结果相关联。例如,如果n与值8相关联,那么结果将与21相关联。

我的工作:

def fib(n):
    if n <= 1:
        result == n
    elif n >= 1:
        result = fib(n-1)+fib(n-2)
    else:
        return result

3 个答案:

答案 0 :(得分:1)

这是因为在所有情况下,分配结果但不返回结果。

因此,例如,当调用fib(1)时,Python返回None,因为在这种情况下你从未告诉它返回result。同样的事情发生在fib(45)

要解决此问题,请始终返回result。 (无论您编写什么类型的程序,这都是一个好主意 - 函数应始终具有明确的返回值。)

def fib(n):
    if n <= 1:
        result = n
    elif n > 1:
        result = fib(n-1)+fib(n-2)
    return result # always return result!

要知道的事情

  • 您应该知道斐波那契序列的这种实现效率最低。如果你可以完全抛弃递归调用并只使用while循环来计算fib(n) - 或者,如果你想要递归,则存储先前计算的fib(n)值,而不是强制它计算全部通往fib(n)的方式 - 您将获得更高效的实施。

  • 您的代码包含许多问题,例如

    • 分配而不返回,我们已经讨论过。
    • 使用==代替=。第一个检查左侧和右侧是否相等,并返回TrueFalse。第二个实际上将右侧的值分配给左侧的变量。不要混淆检查平等与分配。
    • 使用相同的基本案例两次但告诉Python在两种情况下都做了不同的事情。这是一个糟糕的主意,我觉得jonrsharpe在评论中说“认真?”是合理的。这样做的原因是因为这样做没有意义,并且很难预测行为。 if-else语句的重点是在不同情况下执行不同的事物。
    • 根据OP 提供的示例进行编辑。缩进应该只是四个空格,而不是八个。这更像是一个风格问题,但它是标准。

答案 1 :(得分:0)

def fib(n):
    if n < 2:
        return n
    else:
        return fib(n-1)+fib(n-2)

你可以从根本上减少它。你甚至可以忽略其他人并说:

def fib(n):
    if n < 2:
        return n
    return fib(n-1)+fib(n-2)

但是你说你出于某种原因需要有一个其他案例。

答案 2 :(得分:0)

我为任务写了这个。我知道这有点间接,但这很重要,这很重要:)

n = int(input("Insert a number: "))
i = 0
fib_list = [1, 1, 0]
for i in range (0,2):
    if n == 0:
        result = fib_list[2]
    elif n <= 2:
        result = fib_list[0]
for i in range (2,n):
        result = fib_list[0] + fib_list[1]
        fib_list.insert(0, result)
        i += 1
        result = fib_list[0]

顺便说一句,您无需定义要在myprogramminglab问题中使用的输入。

我在此处添加了输入版本,因为我在测试中使用了它。