python 斐波那契数列

1.递归法

#!/usr/bin/python3
#coding=utf-8

def fib_recur(n):
assert n >= 0, "n > 0"
if n <= 1:
return n
return fib_recur(n-1) + fib_recur(n-2)

for i in range(1, 20):
print(i)
print(fib_recur(i), end='\t')

写法最简洁,但是效率最低,会出现大量的重复计算,时间复杂度O(1.618^n),而且最深度1000

2.递推法
#!/usr/bin/python3
#coding=utf-8

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


for i in range(20):
print(fib_loop(i), end=' ')
递推法,就是递增法,时间复杂度是 O(n),呈线性增长,如果数据量巨大,速度会越拖越慢

3.
def fib_loop_while(max):
    a, b = 0, 1
    while max > 0:
        a, b = b, a + b
        max -= 1
        yield a


for i in fib_loop_while(10):
    print(i)

带有yield的函数都被看成生成器,生成器是可迭代对象,且具备__iter__ 和 __next__方法, 可以遍历获取元素
python要求迭代器本身也是可迭代的,所以我们还要为迭代器实现__iter__方法,而__iter__方法要返回一个迭代器,迭代器自身正是一个迭代器,所以迭代器的__iter__方法返回自身即可

posted @ 2019-09-24 16:08  wxhw7021234  阅读(256)  评论(0编辑  收藏  举报