斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、55、89、144、、、

代码实现:

1、打印100以内的fib

    print(0)
    print(1)
    a=0
    b=1
    while True:
        c = a+b
        if c >100:
            break
        a = b    
        b = c    #每循环一次,b的值都重新赋给a,c的和都重新赋值给b
        print(c)

2、打印fib的第101项

a = 0
b = 1
print(0,0)
print(1,1)
index = 1
while True:
    c = a+b
    index +=1
    print('index={},fib={}'.format(index,c))
    a = b
    b = c
    if index==101:break

3、函数循环,并打印101项

def fib_v1(n):
    a=b=1
    for i in range(n-2):
        a,b=b,a+b
    return b
fib_v1(101)

4、递归函数

def fib_v2(n):     #慢
    if n<3:
        return 1
    return fib_v2(n-1) + fib_v2(n-2)
fib_v2(35)

#或者:
def fib_v2(n):
return 1 if n <3 else fib_v2(n-1)+fib_v2(n-2)
fib_v2(35) 

5、使用functools模块

from functools import lru_cache

@lru_cache()
def fib(n):
    return  1 if n <3  else fib(n-1) + fib(n-2)
fib(101)
-----
573147844013817084101

6、定义一个斐波那契数列的类,要求方便调用,计算第n项。有增加迭代数列的方法、返回数列长度、支持索引查找数列项。

class Fib:
    def __init__(self):
        self.items = [0,1,1]

    def __call__(self, index):
        # return self.__getitem__(index)
        return self[index]      #转而调用__getitem__

    def __iter__(self):
        yield from self.items

    def __len__(self):
        return len(self.items)

    def __getitem__(self, index):
        if index < 0:
            raise IndexError('Wrong Index')
        for i in range(len(self), index+1):    #index >= len(self.items)
            self.items.append(self.items[i-1] + self.items[i-2])
        return self.items[index]
    # __call__ = __getitem__

    def __str__(self):
        return str(self.items)
    __repr__ = __str__
-----------------------------------
fib = Fib()
print(fib(5), len(fib))     ---> 5 6
for x in enumerate(fib):
    print(x, end='\t')      ---> (0, 0)	(1, 1)	(2, 1)	(3, 2)	(4, 3)	(5, 5)
print(fib[5], fib[6], fib)       ---> 5 8 [0, 1, 1, 2, 3, 5, 8]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值