Fibonacci(斐波那契)序列的4种求解算法

今天读<python核心编程>的时候看见一个关于斐波那契序列的题目,于是将很就以前看的一篇博文的阅读文摘share一下:

1、最普遍的算法是利用递归:

def fibonacci(n):
    return n>=2 and fibonacci(n-2)+fibonacci(n-1) or n

看上去非常美妙,但其时间复杂度是非常惊人的: O(2^n) :(

2. 另一个常见的算法, 就是用循环取代递归算法:

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

其时间复杂度为: O(n), 相比第1种递归算法, 已经是一种"飞跃"了 :> 它也有其变种, 就是利用 Python 的 generator, 其原理是一样, 只是应用的场合不一样罢了

def fibonacci():
    a, b = 0, 1
    while 1:
        yield a
        a, b = b, a+b
 
f = fibonacci()
n = 100
for i in range(n+1):
    print(next(f))

3. 最后一种算法是利用矩阵运算来加速:

import numpy
 
fibonacci_matrix = numpy.matrix([[1,1],[1,0]], dtype=numpy.ndarray)
def fibonacci(n):
    return fibonacci_matrix**(n-1)[0, 0]

需要用到 numpy 库, 其时间复杂度为: O(logn).

4. 通过 Fibonacci 序列的通用公式, 可以利用简单的数学方法求其近似值:

from math import sqrt
  
def fibonacci(n):
    return int(((1+sqrt(5))/2)**n/sqrt(5))

虽然这是4种算法中速度最快的, 但当n越大,其计算精度偏差越大 :>

转载于:https://www.cnblogs.com/ForLoveJY/p/3252849.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值