婓波那契(Fibonacci)数列 (Python)

有人说婓波那契起源于一对繁殖力惊人,基因非常优秀的兔子,也有人说远古时期的鹦鹉螺就知道这个规律。婓波那契由如下递推关系式定义:

if n=0: F(n)=1

if n=1: F(n)=1

if n>1: F(n)=F(n-1)+F(n-2)

解法 1

使用递归法,由上到下求解

def Fibonacci(n):
    if n == 0 or n==1:
        return 1
    else:
        return Fibonacci(n-1)+Fibonacci(n-2)
print(Fibonacci(3))

解法 2

采用类似动态规划的方法,由下到上求解

def Fibonacci(n):
    dp = [0]*(n+1)
    dp[0], dp[1] = 1, 1
    for i in range(2,n+1):
        dp[i] = dp[i-1] + dp[i-2]
    return dp[n]
print(Fibonacci(3))

解法 3

由递推公式F(n) = F(n-1) + F(n-2),知道F(n)的特征方程为:

x^{2} = x+1

推导:

设有数列c(n) = a*c(n-1)+b*c(n-2)。假设存在x,y满足下式:

c(n)-x*c(n-1) = y*(c(n-1)-x*c(n-2))

c(n)=(x+y)*c(n-1)-x*y*c(n-2)

则对婓波那契数列有

x+y=1,  -xy=1

消去y得:

x^{2} = x+1

 根据求根公式x=\frac{-b*\sqrt{b^{2}-4*a*c}}{2*a}得:

x_{1,2} = \frac{1\pm \sqrt{5}}{2}

所以存在A,B使得:

F(n) = A \times (\frac{1+ \sqrt{5}}{2})^{n}+ B\times( \frac{1- \sqrt{5}}{2})^{n}

代入F(0)和F(1)得:

F(n) = \frac{\sqrt{5}}{5} \times (\frac{1+ \sqrt{5}}{2})^{n}- \frac{\sqrt{5}}{5}\times( \frac{1- \sqrt{5}}{2})^{n}

该方法的缺点是公式中引入了无理数。

解法 4

注意到婓波那契数列是二维递推数列,所以存在一个二维矩阵使得:

\begin{bmatrix} F_{n} & F_{n-1} \end{bmatrix} = \begin{bmatrix} F_{n-1} & F_{n-2} \end{bmatrix}*A

可得:

A = \begin{pmatrix} 1 &1 \\ 1&0 \end{pmatrix}

通过推导得:

\begin{bmatrix} F_{n} & F_{n-1} \end{bmatrix} = \begin{bmatrix} F_{n-1} & F_{n-2} \end{bmatrix}*A = \begin{bmatrix} F_{n-2} & F_{n-2} \end{bmatrix}*A^{2} = \begin{bmatrix} F_{1} & F_{0} \end{bmatrix}*A^{n-1}

代码就不给了,这就是矩阵得大数幂。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值