[英]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
替換fib
的range
以節省內存。
因為創建一個空數組,所以得到一個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.