题目描述

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
要求0<=n<=100。

思路分析

01 递归法

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


图片来源这里

  • 不得不说递归法效率真的太低了,原因是因为重复的计算太多了,所以我们只要想办法避免重复计算就行了。

  • 比如我们可以把已经得到的数列中间项保存起来,在下次需要计算的时候先查找一下,如果前面已经计算过就不用再重复计算了,但是需要O(n)的额外空间。这种方法叫做“记忆化递归法”。

  • 所以,更简单的方法是从下往上计算,首先根据f(0)和f(1)计算出f(2),再根据f(1)和f(2)计算出f(3)…以此类推就可以计算出第n项了,时间复杂度为O(n)。这种方法叫“动态规划”。

优化1 记忆化递归法

使用数组存放计算过的结果,避免重复计算。

class Solution {public:int fib(int n) {if(n<=1) return n;int arr[n+2];使用数组存放计算的结果arr[0]=0;arr[1]=1;for(int i=2;i<=n;i++){arr[i]=(arr[i-1]+arr[i-2])%1000000007;//直接使用数组里的结果}return arr[n];}
};

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

优化2 动态规划

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

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

斐波那契数列的应用:青蛙跳台阶问题。

斐波那契数列 · C++ · 简单相关推荐

  1. 递归——阶乘加斐波那契数列(简单掌握递归思想的敲门砖)

    话不多说,先上源码: 阶乘: #include<iostream> #include<bits/stdc++.h> using namespace std;int JieChe ...

  2. 斐波拉契数列(简单思路)

    题目描述: 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) ...

  3. 递归算法(python),汉诺塔问题,斐波那契数列,一个简单的递归实例,用递归实现阶乘,用递归查看目录及文件

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请 ...

  4. 算法(1)斐波那契数列

    1.0 问题描述 实现斐波那契数列,求第N项的值 2.0 问题分析 斐波那契数列最简单的方法是使用递归,递归和查表法同时使用,可以降低复杂度. 根据数列特点,同时进行计算的数值其实只有3个,所以可以使 ...

  5. python用递归法写斐波那契_python实现斐波那契数列: 递归+备忘录法+动态规划实现...

    1.为什么备忘录法和动态规划法: 斐波那契是很多人入门递归思想的第一课,所以很多人都会最简单的一种递归写法,但是其实递归的过程,他的时间复杂度非常高,达到了O(2的n次方)这样的一个指数级别. 先看最 ...

  6. 斐波那契数列python循环算法求解_斐波那契数列的算法实现 —— python

    斐波那契数列,简单地说,起始两项为0和1,此后的项分别为它的前两项之后. (注:据我百度发现,斐波那契数列的定义并非起始的两项为0和1,而是1和1,鉴于是转发的,在这里不对原作者的文章进行改动,因为, ...

  7. 函数(递归,迭代实现斐波那契数列)

    上篇文章介绍了一下函数的基本内容,这次来讲讲函数的编程技巧--递归,迭代.并运用这两个技巧实现的斐波那契数列. 递 归 递归是一个过程或函数在其定义或说明中直接或间接调用自身的一种方法,把一个复杂的问 ...

  8. 2018.10.09 ZYH的斐波那契数列(线段树+矩阵快速幂)

    描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...

  9. ZYH的斐波那契数列【线段树动态开点+矩阵快速幂求斐波那契】

    描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...

最新文章

  1. 服务器设备监控系统,服务器设备监控系统
  2. Judy alpha 第七天
  3. 删除Office系列软件多余激活信息
  4. MFC实现最小化到托盘
  5. 重磅!激光SLAM算法及框架概述
  6. mat格式数据集转换为arff与txt格式
  7. java自带数据结构(set/list/stack/queue)
  8. sublime插件CSS转rem配置
  9. 《MySQL技术内幕》读书笔记
  10. 即时通讯源码对企业到底有多重要呢?
  11. java 微信 图灵机器人_使用图灵api创建微信聊天机器人
  12. 通过nginx搭建一个基于http-flv的直播流媒体服务器
  13. 新浪微博批量取消关注引发的思考
  14. 安装Kali Linux渗透系统
  15. java erp开源_【程序源代码】基于springboot开源ERP开发框架
  16. golang 枚举 iota
  17. 可控源音频大地电磁理论基础
  18. 关于Linux性能调优之内存负载调优
  19. 《Linux指令从入门到精通》——4.3 Linux下全屏幕文本编辑器的命令行方式
  20. 【数据库SQL】约束

热门文章

  1. JDK 8u 源码下载方法
  2. 蒙迪欧致胜豪华版钥匙没电了怎么启动汽车?
  3. pandas 数据类型之 Series
  4. owncloud mysql_owncloud搭建
  5. 关于B树的学习总结和B+树,B*树的简介
  6. 背包问题九讲学习小记
  7. topic是短语还是句子_英语topic
  8. Jmeter接口测试-文件上传/文件下载
  9. Xilinx ZC706植入Linux系统-笔记
  10. 根据requests和bs4 基于Xpath提取元素