python-斐波那契数列(函数,生成器,递归)实现

题目:斐波那契数列,首项是1,1,之后每项是前两项之和

解题思路

这个用函数实现很简单,但是每次的打印内容都占用内存,所以可以使用生成器去完成,后来又写了个递归。对照一下

代码实现(python)

#斐波那契数列函数实现
def fib(max):
    #初始化下标,数列前两项
    n,a,b=0,0,1
    while n < max:
        a,b = b,a+b
        print(b)
        n=n+1
    return 'done'


#斐波那契数列生成器实现
def fib_generator(max):
    n,a,b = 0,0,1
    while n < max:
        a,b = b,a+b
        yield b
        n = n + 1
    return "done"


#斐波那契数列递归实现
def fib_recurse(i):
    if i < 2:
        return 1
    return fib_recurse(i-2) + fib_recurse(i-1)


if __name__ == "__main__":
    fib(5)
    gen = fib_generator(5)
    #拿不到函数返回值的调用生成器方式 for循环
    for x in gen:
       print(x)
    #可以拿到函数返回值的调用生成器方式 while循环加异常捕捉
    while True:
        try:
            x = next(gen)
            print(x)
        except StopIteration as e:#生成器函数的返回值放在StopIteration的value中
            print("生成器函数返回值:",e.value)
            break
    for i in range(5):
        print(fib_recurse(i))

解题总结

1.其实写这个主要是为了实现生成器方式,但是在这个过程中需要注意的一点就是,如果生成器函数有返回值,那就需要使用while循环+异常捕捉的方式,因为当发生StopIteration异常的时候,就达到了生成器的末尾,也就是return,此时通过value可以得到;如果不需要获取到返回值,就直接使用for循环就好
2.可以使用for循环的就两类,一类是集合类对象:list,turple,dic,set,str,一类就是生成器函数和生成器表达式,但是集合类对象可以使用iter()方法转为生成器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值