找回密码
 立即注册

QQ登录

只需一步,快速开始

工控课堂 首页 工控文库 上位机编程 查看内容

斐波那契数列的两种实现

2022-4-15 20:59| 发布者: 198366809| 查看: 1219| 评论: 0

摘要: 1、斐波那契数列最先研究这个数列的人是意大利人斐波那契,Leonardo Fibonacci,他在描述兔子生长的数目时用上了这数列:第一个月初有一对刚诞生的兔子;第二个月还是只有这一对;第三个月初它们可以生育;以后每月每 ...

斐波那契数列的两种实现

1、斐波那契数列

最先研究这个数列的人是意大利人斐波那契,Leonardo Fibonacci,他在描述兔子生长的数目时用上了这数列:

  • 第一个月初有一对刚诞生的兔子;
  • 第二个月还是只有这一对;
  • 第三个月初它们可以生育;
  • 以后每月每对可生育的兔子会诞生下一对新兔子;
  • 兔子永不死去。

每个月兔子的总对数,就是这样一个序列:

1, 1, 2, 3, 5, 8, 13, 21...

这个序列从第三项开始,每一项都等于前两项之和。

斐波那契数列的两种实现

在数学上,斐波那契数列是以递归的方法来定义:

F(1) = 1

F(2) = 1

F(n) = F(n-1) + F(n-2) (n≥3)

2、代码实现

2.1、递归实现

根据斐波那契数列的数学定义,用递归可以很快实现,且代码简洁易懂。

int fibo(int n) {
    if ((n == 1) || (n == 2)) {
        return 1;
    }
  
    return (fibo(n-1) + fibo(n-2));
}

递归实现虽然简洁,但却有许多重复计算,当 n 的值非常大时,重复计算的次数就会急剧增加,事实上该算法的时间复杂度随着 n 值的增加呈指数增长,其时间复杂度却为 O(2^n)。

斐波那契数列的两种实现

有没有时间复杂度较低的算法呢?

2.2、循环实现

F(n) = F(n-1) + F(n-2) (n≥3)

采用递归的方式实现,有许多重复计算,这些重复计算其实是不必要的。观察斐波那契数列的数学定义,F(n) 的值只与前两项相关,对于任意一个 n 值,只要记住这两个值,并不断更新,就可以避免重复计算。

int fibo(int n) {
    if ((n == 1) || (n == 2)) {
        return 1;
    }
  
    int prev = 1;
    int curr = 1;
  
    for (int i = 3; i <= n; i++) {
        int sum = prev + curr;
        prev = curr;
        curr = sum;
    }
  
    return curr;
}

采用循环的方式,时间复杂度降为 O(n)。

关注公众号,加入500人微信群,下载100G免费资料!

最新评论

热门文章
关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-23 21:56 , Processed in 0.058808 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部