繁体   English   中英

巨大的斐波那契数

[英]Huge Fibonacci Number

我刚开始学习算法,却陷入了寻找巨大的斐波那契数的问题。 我的示例输入是5949。应该在不到5秒的时间内计算出输出。

这是我的尝试:

def calc_fib(n):
    if n < 0:
       print ("Error. Bad input")
    elif n <= 2:
        return 1
    else:
        F = []
    for i in range (2,n):
        F[i] = F[i-1]+F[i-2]
    return F[n]

n = int(input())
print(calc_fib(n))

但是我在数组上收到错误: IndexError: list index out of range

您创建了一个空列表,并且正在索引列表中不存在的位置。 在添加新元素时也请使用append

def calc_fib(n):
    if n < 0:
       print ("Error. Bad input")
    elif n <= 2:
        return 1
    else:
        F = [0,1] # <- change
    for i in range (2,n):
        F.append(F[i-1]+F[i-2]) # <- change
    return F[n]

n = int(input())
print(calc_fib(n))

您需要初始化数组的前两个元素:当i=2 ,行F[i]=F[i-1]+F[i-2]实际上是F[2]=F[1]+F[0] 但是F[1]F[0]不存在:数组为空!

正如其他人提到的那样,您的错误是由于尝试访问列表中不存在的元素引起的。 使用[]创建的新Python列表没有元素,您必须先向其中添加元素,然后才能安全地对其进行索引。

正如我在评论中提到的那样,您无需在此处创建列表,除非您希望保留一个可随机访问的斐波纳契数表。

要计算单个斐波那契数,易卜拉欣的矩阵乘法算法非常快,但实际上并不需要计算F(5949)。 在我的旧2GHz机器上,简单的for循环可以在不到0.06秒的时间内完成操作。

from __future__ import print_function

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

# Test
for i in range(6):
    print(i, fib(i))    

产量

0 0
1 1
2 1
3 2
4 3
5 5

如果在Python 2上执行此操作,请用xrange替换fibrange以节省内存。

因为创建一个空数组,所以得到一个IndexError ,然后在下一步中尝试访问它的最后两个元素。 您必须使用(至少)两个元素对其进行初始化。

这里已经有一些答案,说明您的方法有什么问题。 但是,如果您正在寻找其他想法,这是一种查找斐波纳契数的非常快速的方法。 它使用矩阵乘法并在O(log N)时间内完成。 使用这种方法,您可以找到5949的斐波纳契数(以毫秒为单位)。

def matrix_mul(A, B):
    return ([A[0][0] * B[0][0] + A[0][1] * B[1][0],
         A[0][0] * B[0][1] + A[0][1] * B[1][1]],
        [A[1][0] * B[0][0] + A[1][1] * B[1][0],
        A[1][0] * B[0][1] + A[1][1] * B[1][1]])

def matrix_exp(A, e):
    if not e:
        return [[1,0],[0,1]]
    elif e % 2:
        return matrix_mul(A, matrix_exp(A, e-1))
    else:
        sq= matrix_exp(A, e//2)
        return matrix_mul(sq, sq)

def fibo(n):
    M = [[1,1],[1,0]]
    return matrix_exp(M, n)[0][0]

阅读此书以了解其工作原理

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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