斐波那契数列的7种实现

定义:

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0, F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

递归法 

递归主要是在函数内部调用自己.递归实现的代码,非常容易理解,代码也非常简洁,缺点是效率较低 

def fab(n):
    if n==0 or n==1:
        return n
    else:
        return fab(n-1) + fab(n-2)

print fab(0), fab(1), fab(2), fab(3), fab(4), fab(5)

序列连接法

def myfibs(n):
    seq = [0, 1]
    while len(seq) < n:
        seq += [seq[len(seq)-1] + seq[len(seq)-2]]    
    return seq 

print fab(0), fab(1), fab(2), fab(3), fab(4), fab(5)

递推法

迭代主要思想为: 循环代码中参与运算的变量同时是保存结果的变量,最常见的迭代为遍历列表

def fab(n):
    a, b = 0, 1
    while n > 0:
        a, b = b, a + b
        n -= 1
    return a

print fab(0), fab(1), fab(2), fab(3), fab(4), fab(5)

生成器法

def fab_demo4(num):
    a,b = 0, 1
    while max > 0:
        yield  a
        a, b = b, a+b
        num -= 1
for i in (fab_demo4(5)):#fab(1), fab(2), fab(3), fab(4), fab(5)
    print i

类迭代方法

class Fibonacci(object):

    def __init__(self, num):
        self.num = num

    def __iter__(self):
        if self.num < 1:
            yield 1
        a, b = 0, 1
        while self.num > 0:
            yield a
            a, b = b, a + b
            self.num -= 1
    def __next__(self):
        return self.__iter__()

f = Fibonacci(5)
for i in f:
    print(i)

修饰器法

def cache(func):
    cached = {}
    def _func(args):
        if args not in cached:
            cached[args] = func(args)
        return cached[args]
    
    return _func

@cache
def fab(n):
    if n==0 or n==1:
        return n
    else:
        return fab(n-1) + fab(n-2)

print fab(0), fab(1), fab(2), fab(3), fab(4), fab(5)
import time
start_time = time.time()
print fab(100)
end_time = time.time()
print end_time-start_time

矩阵法

《线性代数》是大学计算机专业类低年级的课程,这门课教的就是矩阵,其实矩阵的本质就是线性方程式。

斐波那契数列中两个相邻的项分别为:F(n) 和 F(n - 1),如果把这两个数当作一个2行1列的矩阵可表示为:

因为 F(n) = F(n-1)+F(n-2),所以就有:

通过反推,其实它是两个矩阵的乘积得来的

依此类推:

 

 最后可推出:

代码实现如下:

import numpy

def fab(n):
    return (numpy.matrix([[1, 1], [1, 0]]) ** (n - 1) * numpy.matrix([[1], [0]]))[0, 0]

print fab(0), fab(1), fab(2), fab(3), fab(4), fab(5)

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值