簡體   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