四种方法实现斐波那契数列的对比

 

# 以下四种方法中,速度最慢的是第一种递归方法但代码最简洁;
# 最好的方法依次是:第三种方法生成器,第二、三种方法


# 1.递归法:写法最简洁,但是效率最低,会出现大量的重复计算,时间复杂度O(1.618^n),而且最深度1000
def fib1(n):
    assert n >= 0, "n > 0"
    if n <= 1:
        return n
    return fib1(n - 1) + fib1(n - 2)

# 2.递推法:递推法,就是递增法,时间复杂度是 O(n),呈线性增长,如果数据量巨大,速度会越拖越慢
def fib2(n):
    a, b = 0, 1
    for _ in range(n+1):
        a, b = b, a+b
    return a
# print(fib2(1000000))

# 3.生成器:带有yield的函数都被看成生成器,生成器是可迭代对象,且具备__iter__ 和 __next__方法, 可以遍历获取元素
def fib3(n):
    a, b = 0, 1
    while n > 0:
        a, b = b, a + b
        n -= 1
        yield a
i = 0
for i in fib3(1000001):
    pass
print(i, end=' ')


# 4.矩阵
# 4.1
import numpy
def fib41(n):
    res = pow((numpy.matrix([[1, 1], [1, 0]])), n) * numpy.matrix([[1], [0]])
    return res[0][0]
# for i in range(10):
#     print(int(fib41(i)), end=' ')

# 4.2使用矩阵计算斐波那契数列:
def _f(n):
    Matrix = numpy.matrix("1 1;1 0")
    # 返回是matrix类型
    return pow(Matrix, n)  # pow函数速度快于 使用双星好 **
def fib42(n):
    result_list = []
    for i in range(0, n):
        result_list.append(numpy.array(_f(i))[0][0])
    return result_list
# print(fib42(1000000))
# 因为幂运算可以使用二分加速,所以矩阵法的时间复杂度为 O(log n)
# 用科学计算包numpy来实现矩阵法 O(log n)

计算部分代码或函数平均执行时间:timeit

import timeit
print(timeit.timeit("fib4(1000000)",
                    setup="from __main__ import fib4",
                    number=1))

 

posted on 2018-01-25 18:16  myworldworld  阅读(206)  评论(0)    收藏  举报

导航