在 Python 中返回斐波那契数列中的整数

Returning an integer number in the Fibonacci Series in Python

我正在尝试构建一个函数,它将取 n 和 return 斐波那契数列中的第 n 个整数。 例如: 斐波那契数列:

1, 1, 2, 3, 5, 8, 13, 21, .....

如果函数是 Fibonacci,那么它将 return: Fibonacci(8)= 21

现在,我正在编写这样的函数:

    def Fibonacci(a):
        ls = []
        for i in range(0, a):
            if i==0 or i==1:
                n=1
            elif i>=2:
                n=ls.append(ls[i-1]+ls[i-2])
        print(n)
        
    Fibonacci(8)

其中显示错误:

IndexError: list index out of range

有什么解决办法吗?

代码即将运行,这里有一些见解和改进:

  1. 列表为空,因此您在第 7 行尝试访问过去的元素时出现异常
  2. [1, 1]初始化列表(如果你期望fib(8)=21
  3. append 不 return 值
  4. 使用小写字母和下划线分隔单词的函数名
def fibonacci(a):
    ls = [1, 1]
    for i in range(2, a):
        ls.append(ls[i - 1] + ls[i - 2])
    return ls[-1]

# 21
print(fibonacci(8))

奖金事实:

使用数学技巧,您可以通过很少的数学运算找到 n-th 数字(而不是迭代过去的值):

import math

SQRT_5 = math.sqrt(5)

def fibonacci(n):
    return int(((((1 + SQRT_5) / 2) ** n) / SQRT_5) + 0.5 )

在“与黄金比例的关系”中阅读有关 Wikipedia 的更多信息。

是因为到i >= 2时数组已经没有元素了,所以应该改一下这行

n = 1

ls.append(1)

因为否则当您稍后尝试访问它时数组中将没有元素

然后

return ls[-1]

print ls[-1]

像这样计算斐波那契数也更有效:

def fib(n):
    a, b = 1, 1

    for i in range(n-1):
        a, b = b, a+b

    return a

附加到列表对于斐波那契数的实现没有意义;您只需要存储最后两个数字,因为所有之前的数字都不再计算在内:

def fib(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    return a

这可以说是 Python 中本系列的“规范”实现。

您实施中的具体问题是您的列表最初是空的,并且没有为 i<2 填充。因此,一旦您的循环到达 i=2,您将尝试访问列表中不存在的两个元素。

IndexError 以及如何跟踪错误

IndexError只能通过尝试访问列表中的项目来触发;这只发生在代码中的 n=ls.append(ls[i-1]+ls[i-2]) 行。

为了帮助调试,您可以在该行之前添加一个 print 语句,并打印 ils,这样您就可以在程序崩溃时知道变量的值.

错误以及如何修正

在这种情况下,答案很简单:您的列表 ls 一开始是空的,您在向列表添加任何元素之前尝试访问 ls[i-1] and ls[i-2]

我建议使用 [0, 1] 初始化列表,因为它们是前两个斐波那契值,并且是您在当前代码中从未附加到列表中的唯一值。

第二个错误和最后更正的代码

此外,ls.append(...)ls 添加了一个元素,但没有 return 值,因此在添加值之后,您应该将其存储在 n 中多了一行 n = ls[-1]。请注意,在 python 中,“位置 -1 中的元素”只是位置 len(ls) - 1 中元素的 shorthand, , 列表中的最后一个元素。

def fibonacci(a):
    ls = []
    for i in range(0, a):
        if i==0 or i==1:
            ls = [0, 1]
            n=1
        elif i>=2:
            ls.append(ls[i-1]+ls[i-2])
            n = ls[-1]
    print(n)

请注意,我调用函数 fibonacci 而不是 Fibonacci。您可能认为这是个人喜好,但编程语言有时具有 well-established 约定和风格习惯。我建议用小写字母命名变量和函数。为 class 名称和例外保留大写字母。

进一步改进您的代码

计算 Fibonacci(a) 时,您需要的值只有 Fibonacci(a-1)Fibonacci(a-2)。不需要将整个先前值列表保存在内存中;您需要保留的只是前两个值。尝试编写一个新的 Fibonacci 函数,其逻辑与以前相同,但只在内存中保留两个值而不是整个列表!

其他人已经指出了如何修复您的代码,但我想从绘图板开始。斐波那契问题是掌握 递归 的一种非常好的方法 - 如果您还没有这样做的话。这里的递归函数将比循环列表更易读并且可能更快。

Python 网上有数百种斐波那契问题的有效解决方案,例如here.

def fibonacci(n):
    ls = []
    for i in range(0,n):
        if (i==0) or (i==1):
            n=1
            ls.append(n)
        elif i>=2:
            ls.append(ls[-1]+ls[-2])
            n=ls[-2] + ls[-3]
    print(n)


while(True):
    x = int(input())
    fibonacci(x)

我们创建了一个列表,如果 n>=2 我们添加了新元素,它是最后 2 个元素的总和。 然后我们打印了新的 last 2. and 3. elements sum 这就是答案...