斐波那契数列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;不需要任何的物质存在于…

抽屉之Tornado实战(5)--点赞与评论树

点赞 点赞的过程&#xff1a;数字增加&#xff0c;并在后台点赞表记录数据 需要发过去的数据&#xff1a;用户id&#xff0c;新闻id 用户id从session里获得&#xff0c;那新闻id怎么获取呢&#xff1f;这想到分页是循环新闻列表来展示内容&#xff0c;循环的新闻id可以做为参…

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

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

用于计算的计算机主机,一种用于区块链计算的计算机主机的制作方法

技术特征&#xff1a;1.一种用于区块链计算的计算机主机&#xff0c;包括计算机主机主体(1)&#xff0c;其特征在于&#xff1a;所述计算机主机主体(1)上开凿有散热孔(2)&#xff0c;且计算机主机主体(1)的内腔通过散热孔(2)与外界相连通&#xff0c;所述散热孔(2)内固定连接有…

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

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

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

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

实战分层架构

现在可选的框架 现在我们开发一个.net应用&#xff0c;面临的选择比较多。我们可以选择entity framework, enterprise library, nhibernate, 还有一个mybatis.net, 即java世界mybatis/ibatis的.net版。 IOC的框架可以选择Unity, Ninject&#xff0c;Spring.net(java的spring对应…

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

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

isleapyear python_Python实战练习——打印日历教程

很长一段时间没有接触过C语言了&#xff0c;想来做这一行当已经有三两年了。今天突然想起来以前用C语言在VC6上写代码的日子&#xff0c;想了想以前的一些实战练习。所以今天打算用Python来写一个C语言以前练习的题目-日历打印器&#xff0c;并根据情况进行优化。效果如上图所示…

在计算机附近用英语怎么说,附近用英语怎么说

附近指靠近&#xff0c;离某地不远的地方&#xff0c;是我们日常表达方位常用的词组。那么你知道附近用英语怎么说吗?下面跟学习啦小编一起学习附近的英语知识吧。附近的英语说法nearbyproximityvicinity附近的相关短语附近的 nearby ; adjacent ; surrounding ; neighbouring…

字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD

Markdown版本笔记我的GitHub首页我的博客我的微信我的邮箱MyAndroidBlogsbaiqiantaobaiqiantaobqt20094baiqiantaosina.com字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD 目录 目录CSV文件简介解析工具类数据格式&#xff1a;工具类数据模型CSV文件简介 逗号分隔值&#x…

python替代_2.3.1 Python 实现的替代者

2.3 执行模块的变种在继续学习之前&#xff0c;应该指出前一节所介绍的内部执行流程反映了如今Python 的标准实现形式&#xff0c;并且这实际上并不是Python 语言本身所必需的。正是因为这一点&#xff0c;执行模块也在随时间而演变。事实上&#xff0c;从某种意义上讲有些系统…

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

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

主页是单一的HTML文件,什么是主页,下列说法最为准确的是 _____。

关于局域网、广域网和互联网的组建和因特网的接入&#xff0c;回答下列问题。(1)关于局域网和广域网的组建&#xff0c;下列说法不正确的是 _____。(A)若要组建多台计算机的局域网络&#xff0c; 通常需要集线器 Hub、网卡和双绞线&#xff0c;通过集线器实现多台计算机的连接;…

【共读Primer】55.[6.4]函数重载--重载与作用域 Page210

讲解之前&#xff0c;先来看一组代码 string read(); void print(const string &); void print(double); void fooBar(int ival) {bool read false; // 新作用域&#xff1a;隐藏了外层的readstring s read; // 错误&#xff1a; read是一个布尔值&#xff0c;而非函数…

python中numpy模块的around方法_Python numpy.around()用法及代码示例

numpy.around(arr&#xff0c;decimals 0&#xff0c;out None)&#xff1a;此数学函数可帮助用户将数组元素平均舍入为给定的小数位数。参数&#xff1a;array :[数组]输入数组。decimal :[int&#xff0c;可选]我们要舍入的小数位。默认值0。如果是-ve十进制&#xff0c;则…

安卓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…

设置centos6 yum源为光盘

1、挂载光盘mount /dev/cdrom /media/cdrom2、设置CentOS-Media.repo检查/etc/yum.repos.d/目录是否存在里文件&#xff0c;如存在&#xff0c;此步略过&#xff0c;如果不存在&#xff0c;手动建立&#xff0c;代码如下&#xff1a;[c6-media]nameCentOS-$releasever - Mediab…

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

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