斐波那契数列

写一个函数,输入 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。

示例 1
输入:n = 2
输出:1

示例 2
输入:n = 5
输出:5

提示
0 <= n <= 100


精选大佬题解
三种解法:

  • 递归(这种会超时,因为递归会一直计算重复的值,导致时间复杂度是O(2*n))
  • 记忆化递归(创建一个数组,存储计算过的节点的值,当遍历到该节点时,直接取出使用,每个结果只计算一次,时间复杂度O(n),空间复杂度O(n))
  • 动态规划(动态规划,根据状态转移方程,计算出结果)

解法:动态规划

状态转移方程:f(n) = f(n-1) + f(n-2)
设一个一维数组,dp[n]。
dp[0]=1;dp[1]=1;
dp[i] = dp[i-1] + dp[i-2];
dp[i]记录第i个斐波那契数的值,根据状态转移方程,由1 - n遍历一遍得到dp[n]的值。
时间复杂度:O(n)
空间复杂度:O(n)

优化:
由于下一个状态的结果只使用了上一个状态的dp[i-1]和dp[i-2],所以使用一维数组不是最优解法,使用三个变量即可,实现代码如下:

int fib(int n){int f0 = 0;int f1 = 1;int result;if(n == 0 || n == 1){return n;}else{int i;for(i = 2;i <= n;i++){result = f0 + f1;f0 = f1 % 1000000007;f1 = result % 1000000007;}}return result % 1000000007;
}

斐波那契数列 - 动态规划相关推荐

  1. [剑指offer][JAVA]面试题第[10-1]题[斐波那契数列][动态规划][记忆化递归]

    [问题描述][中等] 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下:F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N ...

  2. Fibonacci斐波拉契数列----------动态规划DP

    n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h> int fib(int n) { if (n<=1)     retur ...

  3. 动态规划简单应用:斐波那契数列

    斐波那契数列: 又称黄金分割数列,以兔子繁殖为例子而引入,故又称为"兔子数列",指的是这样一个数列:0.1.1.2.3.5.8.13.21.34-(每一项都是前两项之和) 在数学上 ...

  4. 斐波那契数列的实现(简单递归和动态规划)

    斐波那契数列的实现(简单递归和动态规划) 一.简单递归的实现 1 #include "stdafx.h" 2 #include <string> 3 using nam ...

  5. 动态规划实现斐波那契数列求解

    int fibonacciDP1(int n) { // 动态规划不使用数组int a = 0;int b = 1;int sum;int i;if (n == 0)return 0;if (n == ...

  6. Python 实现 动态规划 /斐波那契数列

    1.斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为&quo ...

  7. 八十八、从斐波那契数列和零一背包问题探究动态规划

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 本人看了vivo,阿里巴巴的校招算法题,可以明确知道绝对有动态规划. ...

  8. 动态规划:斐波那契数列里面的东西?

    斐波那契数列 我想每个人都会写斐波那契数列吧!! 斐波那契数列的定义 f(0) = 1,f(1) = 1,f(n) = f(n-1) + f(n-2) 基于递归的方式实现,讲到递归都会用到: def ...

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

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

  10. 斐波那契数列(一)--对比递归与动态规划(JAVA)

    兔子繁殖问题: 这是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子.小兔子长到第3个月后每个月又生一对兔子.按此规律,假设 ...

最新文章

  1. ubuntu中的Jupyter Notebook更换浏览器需要输入密码
  2. 如何使用_如何使用Excel播放音乐
  3. Windows MinGW cmake 安装编译Opencv 3.4.3 C++开发环境
  4. RxJS 系列之一 - Functional Programming 简介
  5. Linux C编程Makefile编写初步-转
  6. 《混合云计算》——2.3 整合势在必行
  7. c# 获取docx中的内容
  8. 小鱼易连 for mac常见问题解答
  9. 华为LACP的相关配置命令
  10. SpreadJS 13.0.0 源代码
  11. 厦门理工学院计算机毕业要求,计算机教学中心-厦门理工学院教务处.PDF
  12. Jmeter压力测试实验 (软件测试实验报告)
  13. 带有两位小数的元转分
  14. UVA 12905 Volume of Revolution (几何,微积分)
  15. 通过antd-charts可视化对比科比和詹姆斯谁更强
  16. wxpyhton打包后图标背景变黑
  17. 如何评价微擎?怎么看待微擎模块应用?
  18. 出生日期正则表达式丨出生日期年月日正则如何表达?
  19. MT6737 Android N 平台 Audio系统学习----录音到播放录音流程分析
  20. 主成分分析(principal component analysis, PCA)公式

热门文章

  1. Hexo博客 | 前端美化之添加公告板---基于Ayer主题有两种模式
  2. New Concept English Two 19 49
  3. 重启编译后的php如何启动,如何在ubuntu上启用ZTS重新编译php?
  4. SQL server查询分数排名第三的同学的信息
  5. 【NOIP2017提高A组模拟9.5】心灵治愈
  6. 【MySQL】Select * From查询语句集合
  7. TMS FlexCel for VCL6.X 源码版,TMS FlexCel 7.1 特殊版
  8. 黄金策略4.9国际原油外盘黄金操作建议,现货黄金分析指导
  9. 辽宁省劳动经济学校计算机专业,辽宁省劳动经济学校计算机与艺术系专业介绍...
  10. java 常用的异常处理