[英]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.