斐波那契数列c++代码_轮到你了,斐波那契数列!

前阵子,日剧“轮到你了”终于大结局了,虽然结局有点一言难尽,但黑岛和二阶堂两个学霸之间的爱情,还是很甜呢呐!两个学霸之间的默契的斐波那契数列也被许多网友认为是凶手行凶的依据。到底这数列有啥神奇之处,又该如何使用代码实现呢?一起往下看吧!dc3f1217875c4abe27942246da56741d.png斐波那契数列,又称黄金分割数列,指的是这样一个数列:1,1,2,3,5,8,13,21,34,55…… 我们不难发现从第三项开始,每一项都等于前两项之和。以递归的方法定义就是F0=0,F1=1,Fn=Fn-1+Fn(n>=2,n∈N*)。(为了与数组下标的概念对应,F0为第0项)。通过上面的解释,相信你对斐波那契数列有一定的了解了吧,那我们来看看今天的题目吧。今天的题目就是:当你输入一个整数n后,输出斐波那契数列的第n项(从0开始,第0项为0,n<=39)。脑袋里有什么想法了么?没有的话来看看下面的三种解法吧。e8032683f6e07f6816741b0fa7833991.gif一、递归解法斐波那契数列具有天然的递归性,根据数学上的定义,可以得出其递推公式为:Fn=Fn-1+Fn-2(n>=2,n∈N*),基础情况为 F0=1,F1=1。对于递归解法,我们可以把问题转化为规模缩小了的同类问题的子问题,找出明确的不需要继续进行递归的条件(即基本情况base case),在本题中的基本情况为F0=0,F1=1, 当递归至基本情况后,无需继续递归,最后把子问题的解汇聚成大问题的解。e387c37999d022e8993e0d2dbd1d0b10.png可画递归树解决递归问题
public class Solution {    public int Fibonacci(int n) {        //base case        if (n==0){           return 0;       }        if(n==1){            return 1;        }       return Fibonacci(n-1)+Fibonacci(n-2);    }}
复杂度分析:

①子问题个数,即递归树中节点的总数,而二叉树节点总数为指数级别,所以子问题个数为 O(2^n);而解决一个子问题的时间,在本算法中,没有循环,只有 f(n - 1) + f(n - 2)f(n−1)+f(n−2) 一个加法操作,所以时间为O(1)。故我们可以得到这个算法的时间复杂度为 O(2^n),指数级别。

②而在递归过程中,需要在存储递归过程中的运算结果,最大空间为树的高度h(即n),而时间复杂度:O(2^n),故空间复杂度:O(h) 即O(n)问题分析:观察递归树,很明显发现了算法低效的原因:存在大量重复计算,运算的规模与n的大小成指数关系,因此这个暴力递归算法虽然简洁明了,但运行效率低下。9bab7411c94ad5cb8100731b618ca576.gif二、动态分析由于暴力递归存在大量的重复运算,降低了算法的性能。所以我们可以用动态规划方法,把运算结果存储起来,从第0项推导至第n项,避免重复运算。我们可以先思考其暴力递归的解法,把暴力递归的过程抽象成状态转移方程,确定可变参数,从基本情况(base case)开始推理,通过状态转移方程,得出最优解,从而减少冗余运算。
public class Solution {      public  int Fibonacci(int n) {        //基本情况        if (n==0){            return 0;        }        if (n<=1){            return 1;        }        int dp[]=new int[n+1];        dp[0]=0;        dp[1]=1;        for(int i=2;i            //状态转移方程            dp[i]=dp[i-1]+dp[i-2];        }        return dp[n];    }}
复杂度分析:  需要开辟长度为n+1的dp数组,同时遍历整个数组,故时间复杂度为O(n),空间复杂度为O(n)。

细心的你会发现,根据斐波那契数列的状态转移方程,当前状态只和之前的两个状态有关,其实并不需要那么长的一个 DP 数组来存储所有的状态,只要想办法存储之前的两个状态就行了。所以可以进一步优化,把空间复杂度降为 O(1)。

      三、斐波那契数列通项公式 

对于这道题目,我们还可以通过斐波那契数列通项公式求解,但这个数学方法仅限于标准的斐波那契数列问题求解,无法应对斐波那契数列的变种问题。公式如下: 12229ae1fc4c673e0cfd5a23c36b2b6a.png
public class Solution {    public  int Fibonacci(int n) {      Long fib = Math.round((Math.pow((1 + Math.sqrt(5)) / 2, n)                              - Math.pow((1 - Math.sqrt(5)) / 2, n))                             / Math.sqrt(5));         return fib.intValue();    }}
复杂度分析:将n代入公式即可得到答案,其中Math.pow(a,b)为求a的b次方、Math.sqrt(a)为求a的正平方根、Math.round(a)为取a最接近的整数(可简单理解为四舍五入取整).对于pow、sqrt、round方法,我们都可以放心地认为其时间复杂度为O(1),因而总的时间复杂度为O(1)。我们使用变量fib存储运算结果,因此空间复杂度为O(1)。               a16344f883a475217d9d55202dc6601b.gif斐波那契数列来自实现生活,有着诸多的变种问题,例如自然界中向日葵花蕊的排列线条顺时针排列线条数为21,逆时针排列线条数为34,是两个相邻的斐波那契数;树木也是以斐波那契数列的方式生长;而黄金比例也经常被用于艺术和建筑的设计,规划和建造许多建筑物,如教堂,寺庙,祭坛,住房以及创造宗教艺术品。(但其实, 斐波那契数列在“轮到你了”就真的只是个数列。)

更多精彩内容:

(点击即可阅读)

用两个栈实现队列用队列实现栈持续更新中.....a02010d8d6537c5734752ec3eff43b8d.png后续我们还会持续更新一些有意思的算法基础题目,有兴趣的可以持续关注一下~ 信析团队持续招新,有兴趣了解的小可爱可以来科技楼232详谈哦(*╹▽╹*)1c0bb75852e217582d6ff017c6d32f99.png祝祖国生日快乐! !

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

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

相关文章

悖论对计算机科学影响,引力波的发现对计算机科学有什么意义?

满意答案saihdfa2016.02.28采纳率&#xff1a;43% 等级&#xff1a;10已帮助&#xff1a;420人引力波的发现对计算机科学的意义&#xff1a;允许引力波携带有更多的之前从未被观测过的信息。引力波有两个非常重要而且比较独特的性质。第一&#xff1a;不需要任何的物质存在于…

全国计算机等级考试题库二级C操作题100套(第98套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

光动能表怎么维护_西铁城手表推荐,西铁城光动能表推荐选购指南

有的朋友们在京东上面看到款式多样的西铁城手表和西铁城光动能手表的时候&#xff0c;不知道怎么选择哪一款适合自己佩戴的&#xff1f;那么今天我就通过这篇文章&#xff0c;跟大家详细的分享一下关于西铁城手表的知识。让大家在选购的时候更加清晰明了的知道哪一款适合自己。…

python-2:工欲善其事,必先利其器 修改jupyter保存文件目录(亲测)

在桌面上创建 Jupyter Notebook快捷方式图标.将打开的Jupyter Notebook程序关闭&#xff0c;然后找到桌面快捷方式&#xff0c;右键>属性&#xff0c;然后把目标后面输入框最后的“%USERPROFILE%”这个参数去掉后&#xff0c;确定。否则之后做的其它修改无法生效。打开 cmd …

全国计算机等级考试题库二级C操作题100套(第99套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

全国计算机等级考试题库二级C操作题100套(第100套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

安卓APP_ 其他(1) —— 程序的签名打包并在手机上运行

摘自&#xff1a;安卓APP_ 其他&#xff08;1&#xff09; —— 程序的签名打包并在手机上运行 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-29 20:58:26 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115310388 刚学到第四个控件&am…

计算机数据恢复专业,专业电脑数据恢复软件哪个好

原标题&#xff1a;专业电脑数据恢复软件哪个好在我们日常清理电脑时&#xff0c;有时会意外删除一些有用的文件&#xff0c;比如重要文件、照片等。这时就需要使用数据恢复软件尝试恢复数据。EasyRecovery是一款强大有效实现数据恢复的软件&#xff0c;软件占用空间小&#xf…

C#开发移动应用系列(2.使用WebView搭建WebApp应用)

C#开发移动应用系列(2.使用WebView搭建WebApp应用) 原文:C#开发移动应用系列(2.使用WebView搭建WebApp应用)前言上篇文章地址:C#开发移动应用系列(1.环境搭建) 嗯..一周了 本来打算2天一更的 - - ,结果 出差了..请各位原谅.. 今天我们来讲一下使用WebView搭建WebApp应用. 说明一…

new 一个模板、类_Java必备基础-类(Class)

你好&#xff0c;我是goldsunC让我们一起进步吧&#xff01;类上一篇文章介绍了Java的基础数据类型和引用数据类型中的数组&#xff0c;引用数据类型除了数组之外&#xff0c;还包括类和接口。那什么是引用数据类型呢&#xff1f;看个例子&#xff1a;public class Test {publi…

华北电力大学计算机科学与技术考研,华北电力大学吴克河教授谈计算机科学与技术专业...

导语&#xff1a;读万卷书不如行万里路&#xff0c;行万里路不如名师点悟。选导师也是个大学问——择师而师&#xff0c;不可草草。为此我们特邀请众多精英导师&#xff0c;我们期待他们的亲身经历和观点建议&#xff0c;能够给考研路上的你以参考……华北电力大学计算机科学与…

安卓APP_ 控件(4)—— ImageView

摘自&#xff1a;安卓APP_ 控件&#xff08;4&#xff09;—— ImageView 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-29 21:52:06 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115311375 开篇&#xff1a;安卓APP_ 控件&#xff0…

使用python的openpyxl模块操作excel

openpyxl&#xff08;可读写excel表&#xff09;专门处理Excel2007及以上版本产生的xlsx文件&#xff0c;xls和xlsx之间转换容易 openpyxl的安装 模块的引入 from openpyxl import Workbook from openpyxl.styles import Color, Font, Alignment from openpyxl.styles import B…

安卓APP_ 控件(5)—— ProgressBar

摘自&#xff1a;安卓APP_ 控件&#xff08;5&#xff09;—— ProgressBar 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-03-31 13:03:07 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115313496 控件ProgressBar就是对进度条的设定&…

sql 写query_为什么需要动态SQL

为什么需要动态SQL在使用 EF或者写 SQL语句时&#xff0c;查询条件往往是这样一种非常常见的逻辑&#xff1a;如果客户填了查询信息&#xff0c;则查询该条件&#xff1b;如果客户没填&#xff0c;则返回所有数据。我常常看到很多人解决这类问题时使用了错误的静态 SQL的解决办…

AMBA总线协议AHB、APB

一、什么是AMBA总线 AMBA总线规范是ARM公司提出的总线规范&#xff0c;被大多数SoC设计采用&#xff0c;它规定了AHB (Advanced High-performance Bus)、ASB (Advanced System Bus)、APB (Advanced Peripheral Bus)。AHB用于高性能、高时钟频率的系统结构&#xff0c;典型的应用…

安卓APP_ 控件(6)—— Notification通知

摘自&#xff1a;安卓APP_ 控件&#xff08;6&#xff09;—— Notification通知 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-02 00:30:14 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115382674 Notification通知的使用 一、创建一…

安卓APP_ 控件(7)——Toolbar栏目样式

摘自&#xff1a;安卓APP_ 控件&#xff08;7&#xff09;——Toolbar栏目样式 作者&#xff1a;丶PURSUING 发布时间&#xff1a; 2021-04-02 15:42:07 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/115395997 Toolbar栏目样式 什么是Toolbar?设置…

Gartner:2013年SIEM市场分析(MQ)

2013年5月7日&#xff0c;Gartner一年一度的SIEM magic quadrant报告出炉了。如下图&#xff1a;对比一下去年的MQ矩阵&#xff1a;简言之&#xff0c;上榜厂商减少到16个&#xff0c;Q1Labs在三强竞争中稍占上风&#xff0c;Arcsight有所退步&#xff0c;Splunk终于跻身第一阵…