斐波那契数列(Fibonacci)数列 c++详解

Fibonacci数列是一个在数学和计算机科学中非常著名的数列。这个数列以其特殊的递推关系而闻名,也因其在自然界中的多次出现而引人注目。

  1. 定义: Fibonacci数列的定义如下:
    • F(0) = 0
    • F(1) = 1
    • 对于 n > 1,F(n) = F(n-1) + F(n-2)
    也就是说,从第三个数开始,每个数都是前两个数的和。
  2. 数列开始: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
  3. 问题描述: Fibonacci问题通常指的是计算数列中的第n个数。
  4. 解决方法: 在代码中,我展示了三种常见的解决方法: a. 递归方法(fibonacciRecursive):
    • 直接按定义实现,简单但效率低。
    • 时间复杂度:O(2^n),空间复杂度:O(n)(递归栈深度)。
    b. 动态规划方法(fibonacciDP):
    • 使用数组存储中间结果,避免重复计算。
    • 时间复杂度:O(n),空间复杂度:O(n)。
    c. 优化空间的方法(fibonacciOptimized):
    • 只保存最近的两个数,进一步优化空间使用。
    • 时间复杂度:O(n),空间复杂度:O(1)。
  5. 应用: Fibonacci数列在自然界和计算机科学中有许多应用:
    • 描述某些植物的生长模式(如向日葵的种子排列)。
    • 在算法分析中用于描述某些算法的时间复杂度。
    • 在金融市场分析中用作技术指标。
  6. 有趣的性质:
    • 相邻Fibonacci数的比值趋近于黄金比例(约1.618)。
    • Fibonacci数列与Pascal三角形有密切关系。

Fibonacci问题是学习递归、动态规划和算法优化的好例子。它看似简单,但涉及了很多重要的编程和数学概念。

#include <iostream>
#include <vector>class FibonacciSolver {
public:// 递归方法计算Fibonacci数int fibonacciRecursive(int n) {if (n <= 1) return n;return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);}// 动态规划方法计算Fibonacci数int fibonacciDP(int n) {if (n <= 1) return n;std::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];}// 优化空间的动态规划方法int fibonacciOptimized(int n) {if (n <= 1) return n;int prev = 0, curr = 1;for (int i = 2; i <= n; i++) {int next = prev + curr;prev = curr;curr = next;}return curr;}
};int main() {FibonacciSolver solver;int n = 10; // 计算第10个Fibonacci数std::cout << "第" << n << "个Fibonacci数(递归方法): " << solver.fibonacciRecursive(n) << std::endl;std::cout << "第" << n << "个Fibonacci数(动态规划方法): " << solver.fibonacciDP(n) << std::endl;std::cout << "第" << n << "个Fibonacci数(优化方法): " << solver.fibonacciOptimized(n) << std::endl;return 0;
}

详细解释每种方法计算F(5)的过程

1.递归方法: 这个方法会显示递归调用的过程

计算 F(5)
计算 F(4)
计算 F(3)
计算 F(2)
计算 F(1)
计算 F(0)
计算 F(1)
计算 F(2)
计算 F(1)
计算 F(0)
计算 F(3)
计算 F(2)
计算 F(1)
计算 F(0)
计算 F(1)
结果: 5

2.动态规划方法: 这个方法会显示DP数组如何被填充:

DP数组初始化: 0 1 0 0 0 0 
计算 F(2): 1, DP数组: 0 1 1 0 0 0 
计算 F(3): 2, DP数组: 0 1 1 2 0 0 
计算 F(4): 3, DP数组: 0 1 1 2 3 0 
计算 F(5): 5, DP数组: 0 1 1 2 3 5 
结果: 5

每个Fibonacci数只被计算一次,并存储在数组中。

3.优化空间的方法: 这个方法只保存最近的两个数:

初始状态: prev = 0, curr = 1
计算 F(2): 1 (prev = 0, curr = 1)
计算 F(3): 2 (prev = 1, curr = 1)
计算 F(4): 3 (prev = 1, curr = 2)
计算 F(5): 5 (prev = 2, curr = 3)
结果: 5

每一步只保存和更新两个变量,大大减少了空间使用。

  • 递归方法简单直观,但有大量重复计算,效率最低。
  • 动态规划方法避免了重复计算,效率高,但需要O(n)的额外空间。
  • 优化空间的方法在保持高效的同时,将空间复杂度降到了O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/50097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

robotframework语法易错点总结(更新中...)

1.列表使用还是$ 1、若想把列表用Set Global Variable设置全局变量时&#xff0c;必须用&#xff0c;当使$设置全局变量时为字符串。 Set Global Variable ${name} Jack Set Global Variable {animals} cat monkey duck dog 2、使用FOR循环遍历列表…

Windows:批处理脚本学习

目录 一、第一个批处理文件 1. &&和 | | 2. | 和 & 二、变量 1.传参变量%name 2.初始化变量set命令 3.变量的使用 4.局部变量与全局变量 5.使用环境变量 6.扩充变量语法 三、注释REM和 &#xff1a;&#xff1a; 四&#xff1a;函数 1.定义函数 2.…

力扣984.不含AAA或BBB的字符串

力扣984.不含AAA或BBB的字符串 贪心 如下 class Solution {public:string strWithout3a3b(int a, int b) {string res;while(a > b && b > 0){res "aab";a--,a--;b--;}while(b > a && a > 0){res "bba";b--,b--;a--;}whi…

js 习题 1

文章目录 前言T1T2T3T4T5T6T7T8T9结语 前言 『最孤独的人最亲切&#xff0c;受过伤的人总是笑的最灿烂。』—— 「素媛」 T1 let buf""; process.stdin.on("readable",function(){let chunkprocess.stdin.read();if(chunk){bufchunk.toString();} });pr…

Python3网络爬虫开发实战(2)爬虫基础库

文章目录 一、urllib1. urlparse 实现 URL 的识别和分段2. urlunparse 用于构造 URL3. urljoin 用于两个链接的拼接4. urlencode 将 params 字典序列化为 params 字符串5. parse_qs 和 parse_qsl 用于将 params 字符串反序列化为 params 字典或列表6. quote 和 unquote 对 URL的…

GIS前沿技术

无论是初步接触到GIS的学生&#xff0c;还是对GIS已经有一定的了解的从业者&#xff0c;肯定都非常关心两个问题&#xff1a;GIS有没有发展前景&#xff0c;GIS有哪些应用价值&#xff1f; 关于这两个问题&#xff0c;笔者的答案是GIS作为一门融合了空间数据采集、存储、处理、…

【数据结构】堆,优先级队列

目录 堆堆的性质大根堆的模拟实现接口实现构造方法建堆入堆判满删除判空获取堆顶元素 Java中的PriorityQueue实现的接口构造方法常用方法PriorityQueue注意事项 练习 堆 如果有一个集合K {k0&#xff0c;k1&#xff0c; k2&#xff0c;…&#xff0c;kn-1}&#xff0c;把它的…

Listen(sockfd,backlog)监听函数的第二个参数到底是什么?深度解释

listen队列剖析 int listen(int sockfd,int backlog) backlog : 监听套接字队列 对于一个调用监听的套接字&#xff0c;系统会维护给这个套接字两个队列 1. 未完成连接队列 //当客户端发生三次握手的第一次syn包给服务器的时候&#xff0c;服务器就会再未完成队列中创建…

深入探索 Postman:使用 API 性能测试优化你的 Web 服务

引言 在当今快速发展的互联网时代&#xff0c;Web 服务的性能至关重要。API 作为服务之间的桥梁&#xff0c;其性能直接影响到整个应用的响应速度和用户体验。Postman&#xff0c;作为一个多功能的 API 开发工具&#xff0c;提供了强大的性能测试功能&#xff0c;帮助开发者评…

2024第29届郑州全国商品交易会

第29届郑州全国商品交易会 2024第四届餐饮与供应链专题展 邀 请 函郑州全国商品交易会&#xff08;简称郑交会&#xff09;是全国大型性经贸活动&#xff0c;一直秉承“政府指导&#xff0c;市场化运作”的模式&#xff0c;自1995年以来已成功举办了二十八届&#xff0c;是国内…

【java】BIO,NIO,多路IO复用,AIO

在Java中&#xff0c;处理I/O操作的模型主要有四种&#xff1a;阻塞I/O (BIO), 非阻塞I/O (NIO), 异步I/O (AIO), 以及IO多路复用。下面详细介绍这四种I/O模型的工作原理和应用场景。 1. 阻塞I/O (BIO) 工作原理 阻塞I/O是最传统的I/O模型。在这种模型中&#xff0c;当一个线…

CSS 自适应图片根据 div 大小进行均匀填充

目录 前言使用 object-fit 属性示例代码 HTMLCSS 总结相关阅读 1. 前言 在Web开发中&#xff0c;经常需要图片根据其容器的大小进行自适应填充&#xff0c;使得图片在任何设备和屏幕尺寸下都能保持良好的显示效果。本文将介绍如何使用CSS中的 object-fit 属性来实现这一需求…

安装caffe-CPU版本并进行训练

目录 前言 0、安装Ubuntu 18.04 版本 输入ls没有反应 ubuntu换源 换源出现的问题 1、安装caffe出现E:Unable to locate package caffe-cpu问题 2、把 code 文件夹下载到 ubuntu 3、在本地使用caffe-CPU&#xff0c;并部署数据标注工具 ATool 问题1 问题2 问题3 命令行…

vector(STL)

文章目录 定义访问函数.push_back().pop_back()insert():erase(): 定义 vector<typename> name;typename是类型名 访问 1.定义为vector v 的vector容器&#xff0c;可以使用 v[0]、v[1]、v[2]…这种方式来访问。 但不能这样赋值比如v[0]10&#xff0c;这样是不行的 2.…

leedcode-数组-15 最接近的三数之和

原理 1、对数组进行升序排列&#xff1b; 2、定义变量_min&#xff0c;初始值是升序后数组的前3个元素之和&#xff0c;默认当前3个数之和离目标值最近&#xff1b; 3、遍历数组&#xff1b; 4、定义首指针为start&#xff0c;表示当前遍历元素的下一个元素&#xff0c;即i…

URL过滤、DNS过滤和内容过滤的总结

目录 URL过滤 URL和URI URL -- 统一资源定位符 URI --- 统一资源的标识符 URL和URI之间的区别 URL过滤的方式 HTTP协议获取URL的方式 HTTP协议做控制管理的流程 HTTPS协议做控制管理的流程 1&#xff0c;配置SSL的解密功能 2&#xff0c;直接针对加密流量进行过滤 例…

svelte - 1. 基础知识

svelte中文官网 vue和svelt语法对比 掘金-svelte入门简介 文章目录 1、基本页面框架2、动态属性3、嵌套组件4、@html: 插入html标签,显示真实dom元素5、点击事件 on:click={handleClick}6、响应式声明7、父子组件通信8、if-else(1)if(2)if - else(3)if - else if - else…

解决 Shiro 重复调用 doGetAuthenticationInfo 导致异常处理错误的问题

遇到一个 Shiro 中反复调用 doGetAuthenticationInfo 导致异常没有被成功处理的问题&#xff0c;经过一些源码调试&#xff0c;发现了问题的所在&#xff0c;只需在继承 BasicHttpAuthenticationFilter 的类中重写 onAccessDenied 方法即可。 文章目录 1.问题环境2.问题描述3.问…

kubectl命令收集

#查看node节点的IP信息&#xff1a; kubectl get nodes -o wide PV是一个抽象的存储资源&#xff0c;它定义了存储的类型、大小和访问模式&#xff0c;而不包含节点的具体信息。 要查看PV所在节点的IP地址&#xff0c;您可以通过PV所绑定的PVC来查找绑定了PV的Pod&#xff0c…

2024-07-23 Unity AI行为树2 —— 项目介绍

文章目录 1 项目介绍2 AI 代码介绍2.1 BTBaseNode / BTControlNode2.2 动作/条件节点2.3 选择 / 顺序节点 3 怪物实现4 其他功能5 UML 类图 项目借鉴 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 项目介绍 ​ 本项目使用 Unity 2022.3.32f1c1&#xff0c;实现基…