斐波那契数列的集中实现方式

2.1 用匿名函数的方式生成

 

fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2)


通过执行>>>fib(n) 来输出斐波拉契数列第n项的值。

也可以通过 listData = [fib(i) for i in range(1,n)]来生成斐波拉契数列前n项的值,最后通过print listData可以打印出结果。

2.2 利用装饰器的方式生成

def memo(func):
    cache = {}
    def wrap(*args):
        if args not in cache:
            cache[args] = func(*args)
        return cache[args]
    return wrap
 
 
@ memo
def fib(i):
    if i < 2:
        return 1
    return fib(i-1) + fib(i-2)

对于装饰器,这里暂时不做过多的解析,请大家暂时自行查阅学习。

效果图:

 

2.3 定义简单的方法来实现

def fib(n):
    a, b = 0, 1
    for _ in xrange(n):
        a, b = b, a + b
    return b
 


 

执行效果图:

 

2.4 利用迭代器的方式实现

 

class Fib:
    def __init__(self):
        self.prev = 0
        self.curr = 1
 
    def __iter__(self):
        return self
 
    def __next__(self):
        value = self.curr
        self.curr += self.prev
        self.prev = value
        return value


这里我用的是python3,python2需要修改__next__(self):方法,其实生成的是一个无限循环的迭代器,也可以使用 itertools模块把无限迭代器转为有限迭代器。

 


 

from itertools import islice
 
class Fib:
    def __init__(self):
        self.prev = 0
        self.curr = 1
 
    def __iter__(self):
        return self
 
    def __next__(self):
        value = self.curr
        self.curr += self.prev
        self.prev = value
        return value
 
>>> f = Fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]


但是这种方法不能单独取出第n项的值。不建议用这种方法实现斐波拉契数列,但是可以作为一种装逼的方式,在面试的时候可以给你增加点分数,其实就是迭代器的使用方式。

 

以上是我简单的总结的几种方式,以后有新的实现方式会修改博客进行更新,有其他方法的学友可以在下面留言分享交流,共同学习,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值