题目描述

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。

n<=39

分析:

虽然在学递归函数时,会用斐波那契数列作为例子,但这并不能说明递归的解法最合适这个题目,我自己也试过,在牛客网上用递归来做,运行结果会提示算法运行超过规定的时间,原因是算法复杂度过高。以求解f(9)为例,需要先求f(8)和f(7),求解f(8)时,需要求解f(7)和f(6),求解f(7)时,需要求解......可以用树形结构来表示这种依赖关系:

f(10)

/          \

f(9)          f(8)

/     \        /      \

f(8)      f(7)  f(7)    f(6)

..................................................

我们不难发现其中很多结点都是重复的,而且重复的结点会随着n的增大而急剧增加,这意味着如果n的值很大,计算将会十分复杂。

递归的实现如下:(复杂度太高不合适)

class Solution {
        public:

int Fibonacci(int n) {

if(n<=0)

return 0;

if(n=1)

return 1;

for(int i=2;i<=n;i++)                  //注意等于号

{

return Fibonacci(n-1)+Fibonacci(n-2);

}

}
};

递归代码之所以很慢是因为重复的计算量太多,我们只是想办法避免重复计算就行了。比如我们可以把已经得到的数列中间保存起来,如果下次需要计算的时候我们先检查一下,如果前面已经计算过了就不用计算了。

其实更简单的办法就是从下往上计算,首先根绝f(0)和f(1)得到f(2),然后根据f(1)和f(2)得到f(3).....就是可以定义两个值表示当前计算值的前面两个值,front1和front2。初始值front1为f(0)=0,front2为f(1)=1,计算f(2)=front1+front2=1,此时需要更新front1与front2,为计算f(3)做准备。即f把ront2的值赋给front1,把f(2)的值赋给front2,即f(3)=front1+front2=f(1)+f(2)。依次内推。。。。。。

class Solution {
public:
    int Fibonacci(int n) {
        int result[2]={0,1};
        if(n<2)
            return result[n];
        int frontData1=0;
        int frontData2=1;
        int Value=0;
        for(int i=2;i<=n;i++)
          {
              Value=frontData1+frontData2;
              frontData1=frontData2;
              frontData2=Value;
          }
        return Value;
    }
};

剑指offer面试题[9]-裴波那契数列相关推荐

  1. 剑指Offer - 面试题10- I. 斐波那契数列

    文章目录 1. 题目 2. DP解题 3. 面试题 08.01. 三步问题 4. LeetCode 509. 斐波那契数 1. 题目 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 ...

  2. python剑指offer面试题_剑指offer面试题Q10 斐波那契数列 python解法

    Q10.斐波那契数列 题目描述 写一个函数,输入n,求斐波那契数列的第n项. 解题思路 思路一 递归 递归很简单但是并不能AC python实现代码 class Solution: def Fibon ...

  3. 剑指offer面试题10- I. 斐波那契数列

    题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: 思路 详见链接 代码 class Solution:def fib(self,n:int) ...

  4. 剑指offer(7)斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 题目分析 我们都知道斐波那契可以用递归,但是递归重复计算的部分太多了(虽然可以通过),但是这 ...

  5. 剑指offer Leetcode 10 I .斐波那契数列

    解法1:效率低的解法 复杂度 速度十分缓慢,重复计算太多 代码 //未考虑溢出和取模 class Solution {public:int fib(int n) {if(n <= 0)retur ...

  6. 【剑指offer-Java版】09斐波那契数列

    斐波那契数:比较简单,但是重点是讲效率的求解出来 简单的使用两个临时变量大大减少了重复计算 对于非常大的数如果使用long 来表示,那么 第100项左右就会发生溢出 换了BigInteger,理论上是 ...

  7. 剑指offer——面试题9:求斐波那切数列的四种方法

    剑指offer--面试题9:求斐波那切数列的四种方法 另一个相关的链接:https://blog.csdn.net/Allenlzcoder/article/details/80297333 总结下求 ...

  8. 剑指 offer 面试题精选图解 10-I.斐波那契数列

    大家好,我是程序员吴师兄,欢迎来到图解剑指 Offer 专栏,在这个专栏里我将和大家一起学习如何用合理的思维来思考.解题.写代码. 今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 ...

  9. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

最新文章

  1. 前端工程化系列[06]-Yeoman脚手架核心机制
  2. 2013年中国高校网购实力排行榜
  3. SQL Server 2008创建数据库
  4. leetcode- 两数之和
  5. android jni jbyteArray转char*
  6. 【解析】1057 数零壹 (20分)(进制转换)
  7. Meta AI 发布 data2vec!统一模态的新里程碑!
  8. ctrl c 失效了_[安卓+PC双端]超C女仆无馬中字
  9. java正则表达式非贪婪_正则表达式中的贪婪与非贪婪匹配模式
  10. 有助于获得优质流量的免费SEO关键词工具
  11. linux期末考试试题4,Linux试题4
  12. Serv-U FTP Jail Break(越权遍历目录、下载任意文件)
  13. (20)Linux_C_进程通信(IPC)函数
  14. 通过ln链接目录到目标
  15. 一文带你了解SQL的执行计划(explain)
  16. vue弹出alert_vue.extend实现alert模态框弹窗步骤详解
  17. Renascence的C++笔记
  18. 别踩白块儿 开源免费(C++)
  19. LVS负载均衡DR模式安装和配置过程详解
  20. 试读《Java特种兵(上册)》

热门文章

  1. .NET下一种简单的调试诊断方法
  2. eclipse项目如何变成web项目_Eclipse中将Java项目转换成Web项目的方法
  3. 取名字_新生婴儿取名字大全2021
  4. android程序root权限,android应用程序中应用root权限
  5. 精度计算——大数阶乘
  6. 兴业太阳能:将“绿色能源”带到国外
  7. ZeroMQ(java)之负载均衡
  8. 从0开始搭建基于Zookeeper的Spark集群
  9. Array, Vec 与 Slice
  10. Sql Server系列:排序函数