当前位置: 首页 > news >正文

Fibonacci数列实现C++

Fibonacci

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。

方法一:递归

斐波那契数列公式为: F ( n ) = { 0 , n = 0 1 , n = 1 , 2 F [ n − 1 ] + F [ n − 2 ] , n > 2 F(n) = \begin{cases} 0, & n=0 \\ 1, & n =1,2 \\ F[n-1]+F[n-2], &n>2 \end{cases} F(n)=0,1,F[n1]+F[n2],n=0n=1,2n>2, 初始值 F [ 0 ] = 0 , F [ 1 ] = 1 F[0]=0,F[1]=1 F[0]=0,F[1]=1考虑使用递归的方法。

class Solution {
public:
    int Fibonacci(int n) {
        if (n == 0 || n == 1) return n;
        return Fibonacci(n-1) + Fibonacci(n-2);
    }
};

递归算法实现简单,代码量少,但时间复杂度为 o ( 2 n ) o(2^n) o(2n),空间复杂度为递归栈的空间
为什么时间复杂度为 o ( 2 n ) o(2^n) o(2n),可以从二叉树的节点个数来考虑,递归算法可以展开为一个二叉树,所以有 n n n项的递归数列,可以看成深度为 n n n二叉树,故算法运算次数为二叉树上至多含有的节点个数 2 n − 1 2^n-1 2n1,时间复杂度为 o ( 2 n ) o(2^n) o(2n)

方法二:动态规划

递归算法的时间复杂度高是因为存在很多重复的计算,改进办法是将计算的过程保存。动态规划是不用递归过程,直接从子树求得答案,过程是从下往上。简而言之,我们已知前两项的值,然后我们就可以用前两项的值求出第3项的值,接着求第4、第5、……,直到求出第n项的值。

int Fibonacci(int n) {
    vector<int> dp(n+1, 0);
        dp[1] = 1;
        for (int i=2; i<=n; ++i) {
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
}

继续优化,例如求第五项的时候只用到第四项和第三项,因此前面的项就不需要保存,来占用内存空间。通过定义三个变量交替存储计算结果。

class Solution {
public:
    int Fibonacci(int n) {
        if (n == 0 || n == 1) return n;
        int a = 0, b = 1, c;
        for (int  i = 2; i <= n; ++i){
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

相关文章:

  • 剑值offer之替换空格
  • 剑指offer之反转链表
  • 剑指offer之重建二叉树、用两个栈实现队列、旋转数组的最小数字
  • 剑指offer(c++)-01.数组中重复的数字
  • 剑指offer(c++)-02.二维数组中的查找
  • 操作系统-01.操作系统的运行机制和体系结构
  • 剑指offer(c++)-03.替换空格
  • 剑指offer(c++)-04.从尾到头打印链表
  • 操作系统-02.中断与异常及系统调用
  • 操作系统-03.进程的定义、组成、组织方式、特征
  • 操作系统-04.进程的状态与切换
  • 操作系统-05.进程控制
  • 操作系统-06.进程通信
  • 操作系统-06.线程概念、多线程模型
  • 操作系统-07.处理机调度概念、层次
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【Amaple教程】5. 插件
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript HTML DOM
  • java概述
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Just for fun——迅速写完快速排序
  • Python学习笔记 字符串拼接
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 力扣(LeetCode)56
  • 时间复杂度与空间复杂度分析
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • ​什么是bug?bug的源头在哪里?
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #数学建模# 线性规划问题的Matlab求解
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)hibernate配置管理
  • (十六)串口UART
  • (四)汇编语言——简单程序
  • (一)kafka实战——kafka源码编译启动
  • (一)认识微服务
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • **PHP分步表单提交思路(分页表单提交)
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net 微服务 服务保护 自动重试 Polly
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net的C#语言取月份数值对应的MonthName值
  • ?
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [C#]winform部署yolov9的onnx模型
  • [CISCN2019 华东南赛区]Web11
  • [Labtools 27-1429] XML parser encountered a problem in file
  • [Latex] Riemann 问题中的激波,接触间断,膨胀波的 Tikz 绘图
  • [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞