【数学】斐波那契数列问题及复杂度

1. 定义

数学上,以递归的方式来定义:

  • F ( 1 ) = 1 F(1) = 1 F(1)=1
  • F ( 2 ) = 1 F(2) = 1 F(2)=1
  • F ( n ) = F ( n − 1 ) + F ( n − 2 )    ( n ⩾ 2 ) F(n) = F(n-1) + F(n-2)\space\space (n \geqslant 2) F(n)=F(n1)+F(n2)  (n2)

2. 来源

在西方,最先研究这个数列的人是意大利人斐波那契(Leonardo Fibonacci),提出一个数列用来描述兔子生长的数目:

  • 第一个月初有一对刚诞生的兔子
  • 第三个月初它们可以生育兔子
  • 每月每对可生育兔子会诞生一对新兔子
  • 兔子永不死去

如果 n n n 月有 a a a 只兔子, n + 1 n+1 n+1 月有 b b b 只兔子,则 n + 2 n+2 n+2 月有 a + b a+b a+b

3. 算法

3.1 递归方法
int fibonacci(int a){
    if(a<3){
        return 1; // n=1或n=2时
    }
    return fibonacci(a-1) + fibonacci(a-2); // n>2时
}
  • 时间复杂度: O ( 2 n ) O(2^n) O(2n) (递归树)
  • 空间复杂度: O ( n ) O(n) O(n) (栈的压栈和出栈)
3.2 动态规划
int64_t fibonacci_dp(int a){
    int n = 10000;
    int64_t f[n]; 
    f[1] = 1;
    f[2] = 1;
    for(int i=3; i<=a; i++){
        f[i] = f[i-1] + f[i-2];
    }
    return f[a];
}
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
3.3 简化动态规划
int64_t fibonacci_dp_simplify(int a){
    int64_t m = 1, n = 1, r = 1;
    for(int i=3; i<=a; i++){
        r = m + n;
        m = n;
        n = r;
    }
    return r;
}
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)
3.4 最优解法(套公式)
double fibonacci_math(int a){ // 返回值类型为double
    return (pow((1+sqrt(5))/2, a) - pow((1-sqrt(5))/2, a))/sqrt(5);
}
  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 空间复杂度: O ( 1 ) O(1) O(1)
  • 公式: F ( n ) = 1 5 [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] F(n) = \dfrac{1}{\sqrt{5}} \bigg[ \bigg(\dfrac{1+\sqrt{5}}{2}\bigg)^n - \bigg(\dfrac{1-\sqrt{5}}{2}\bigg)^n\bigg] F(n)=5 1[(21+5 )n(215 )n]
    数学推导(wiki)数学推导(baidu)

4. 应用

  • 黄金分割:
    斐波那契数列的后一项与前一项的比值构成一个数列 1 1 , 2 1 , 3 2 , 5 3 , 8 5 . . . \dfrac 1 1, \dfrac 2 1, \dfrac 3 2, \dfrac 5 3, \dfrac 8 5... 11,12,23,35,58...
    趋近于黄金分割: F ( n + 1 ) F ( n ) ≈ 1 + 5 2 = φ ≈ 1.618... \dfrac {F(n+1)}{F(n)} \approx\dfrac{1+\sqrt5}{2} = \varphi\approx1.618... F(n)F(n+1)21+5 =φ1.618...
    例如
    许多生物的构成都和斐波那契数列呈正相关。
    向日葵的种子排列顺序有99%是 F n F_n Fn

    人体的黄金比例: d 头 顶 至 脚 底 d 肚 脐 至 脚 底 = lim ⁡ x → ∞ F ( n + 1 ) F ( n ) = φ \dfrac{d_{头顶至脚底}}{d_{肚脐至脚底}} = \displaystyle\lim_{x\to\infin}{\dfrac{F(n+1)}{F(n)}}=\varphi dd=xlimF(n)F(n+1)=φ


参考文章:https://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值