斐波那契数列

数学中有名的数列,fibonacci数列算一个。计算公式是:f(n) = f(n-1) + f(n-2),但是如果用这个公式写一个递归函数效率就太低了,低的原因是每一项的计算都要推导到f(0)和f(1)才能算出来,而且不能记住已经得到的结果,例如计算f(5),根据公式f(5) = f(4) + f(3),而f(4) = f(3) + f(2),f(3) = f(2) + f(1),计算f(3)时算出来的f(2)并不能应用到计算f(4)的过程里,甚至f(3)的值已经算出来了,但在算f(4)是还是要重新算一遍f(3),这就慢多了,尤其是在n很大的情况下,更好的解决方案是将已经算出来的数列中的项保存起来,这样下次用到时就不用重新计算了,下面的python代码有两个函数,第一个函数求第n项的值,第二个函数根据值来找到对应的n来。

def fibonacci_value(index):

if index > 998:

raise ValueError('{0} overcome recursion limit.'.format(index))

if index < len(li):

return li[index]

else:

next = fibonacci_value(index-1) + fibonacci_value(index-2)

li.append(next)

return next



def fibonacci_index(value):

if value > fibonacci_value(997):

raise ValueError('{0} overcome recursion limit.'.format(value))

lo = 0

hi = 997

while lo <= hi: # binary search

mid = lo + (hi - lo) // 2

if value == fibonacci_value(mid):

return mid

elif value > fibonacci_value(mid):

lo = mid + 1

else:

hi = mid - 1

else:

return -1

li = [0, 1]


斐波那契数列也叫黄金分割数列,因为f(n - 1) / f(n)趋近于0.618

posted @ 2011-10-07 20:40  GamerH2o  阅读(460)  评论(0编辑  收藏  举报