斐波拉契数是一个很经典的问题,也会很多公司面试的考题,每个学习计算机的同学都会接触这个问题,尤其是在学习递归的时候,利用递归来解决斐波拉契数是很多教材采用的一个例子,所以很多同学一想到斐波拉契马上就会采用递归,递归貌似简单,但是效率真的很高吗?不然!下面是我在学习动态规划的过程中总结的集中解决斐波拉契数的不同方法:

一、最野蛮最原始的方法

[cpp] view plaincopyprint?
  1. long f0(int n)
  2. {
  3. if (n == 0 || n == 1)
  4. return n;
  5. else
  6. return F(n - 1) + F(n - 2);
  7. }

这是最直接的递归方式,其时间复杂度为O(1.618^n),是一个指数时间级的算法,当n超过30时,你就慢慢等待吧,运气差的话直接死机了。

二、自底向上的动态规划方法

我们已知F(0)和F(1)的值,则我们从F(2)开始就可以利用前面两个已经计算出来的值,这样从小到大就可以最终求出F(n)

[cpp] view plaincopyprint?
  1. long F(int n)
  2. {
  3. long f1,f2,k,t;
  4. if(n < 2) return n;
  5. f1 = f2 = 1;
  6. for (k = 2; k < n; k++)
  7. {
  8. <span style="white-space:pre">  </span>t = f1 + f2;
  9. f1 = f2;
  10. f2 = t;
  11. }
  12. return t;
  13. }

其时间复杂度已经从指数级降到线性级O(n)了,空间复杂度为O(1)

三、自顶向下的动态规划方法

这种方法也是采用递归的思想,但是确应用了动态规划的原理:将以前的计算结果存储起来备用,这样在以后出现同样的问题时就不用重复计算。也叫备忘录方法。

[cpp] view plaincopyprint?
  1. int fib[1000] = {0};
  2. long f1(int n)
  3. {
  4. int t;
  5. if(fib[n] != 0) return fib[n];
  6. if(n == 0) t = 0;
  7. if(n == 1) t = 1;
  8. if(n > 1) t = f1(n-1) + f1(n - 2);
  9. return fib[n] = t;
  10. }

自顶向下的动态规划递归方法大大减少了递归调用的次数,避免了重复递归计算,其算法时间复杂度也为线性级,其关键就是能够"保存已经计算过的子问题的结果".

动态规划学习之三种方法解决斐波拉契数相关推荐

  1. Java编程怎么打印输出第n项斐波拉契数

    具体实现方法: package JavaWork_03; /** Goal:求第n项斐波那契数* Author:@Tang.Mitnick* Site:ChongQing* */ //设计思想:运用一 ...

  2. 两种方法计算斐波那契数列第n项

    百度斐波那契数列定义: 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为&qu ...

  3. 斐波拉契数的几种求法

    斐波拉契数列求法的题目有: 509 斐波拉契 面试题10-1 斐波拉契数列 70 爬楼梯 解法一: 傻递归 public class Solution {public int fib(int N) { ...

  4. 【力扣动态规划基础专题】:509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 62. 不同路径 63. 不同路径 II 343. 整数拆分 96. 不同的二叉搜索树

    /** 动态规划专题:这是最简单的并且已经给出了转移方程,平时我们用dp[]数组来表示转移方程转移方程: dp[n] = dp[n-1]+dp[n-2]初始值:dp[0] = 0 , dp[1] = ...

  5. 深入剖析斐波拉契数列

    深入剖析斐波拉契数列 前言 动态规划作为一种非常经典的一类算法,不仅在解决实际问题当中有很多实际的应用,同时通常也是面试的一个重点.本篇文章一步步剖析动态规划的基本原理,通过斐波拉契数列问题(优化时间 ...

  6. 算法笔记_001:斐波那契数的多种解法(Java)

    本篇文章解决的问题来源于算法设计与分析课程的课堂作业,主要是运用多种方法来计算斐波那契数.具体问题及解法如下: 一.问题1: 问题描述:利用迭代算法寻找不超过编程环境能够支持的最大整数的斐波那契数是第 ...

  7. Python案例:格式化输出斐波拉契数列

    文章目录 一.提出任务 二.运行效果 三.实现步骤 1.定义fib(n)函数 2.采用format()函数实现格式化输出 3.采用repr()与rjust()函数实现格式化输出 4.运行程序,查看效果 ...

  8. 斐波拉契数列前n项和 斐波拉契数列第n项

    此篇题解不为别的,纯属纪念,纪念一个已经且也许永远淡出我生活的人... 记不清是大二还是大三了,只记得在教四304实验室,你教我如何用矩阵快速幂来求解斐波拉契数列的第n项,然后考我怎么用类似的方法计算 ...

  9. C语言——利用递归函数完成斐波拉契前n项的计算

    C语言,利用函数的方法完成斐波拉契前n项的计算 #include<stdio.h> int fun(int n) {if(n>2){return fun(n-1)+fun(n-2); ...

最新文章

  1. 13.2.9 中间件
  2. GNS结合SecureCRT连接问题
  3. Windows XP时代终结:假设你还在用它怎么办
  4. 缺少using namespace std;
  5. split 中文 java_Java String[] split() 方法
  6. 1276A. As Simple as One and Two
  7. android的交互方式,Android与js的交互方式
  8. 水面反光如何拍摄_拍照反光太难看?这八个办法值得一试!
  9. java分层model_SpringMVC体系分层模式原理图解
  10. XP中轻松获取未使用的IP地址
  11. python产生随机值-random模块
  12. 论文笔记_S2D.53_2013-ICCV_单目相机半稠密视觉里程计(VO)
  13. 符号_液压图形符号识别之减压阀符号原理
  14. php 后台实现订单支付成功后语音提示
  15. 彻底解决[未识别的网络][公共网络]的问题
  16. LIBSVM的FQA
  17. 【汇总】ThinkPHP6入门手册
  18. sprint 1 总结
  19. VisionPro软件笔记
  20. SAP:采购申请ME51N/ME52N/ME54N/ME57屏幕增强

热门文章

  1. 【C 语言】数组 ( 数组取值操作 | array[i][j] 用法 等价于 *( *(array = i) + j ) 用法 | 下标操作到指针操作演化过程 )
  2. 【Google Play】IARC 年龄分级 ( IARC 国际年龄分级联盟 | Google Play 设置应用年龄分级 )
  3. 【Flutter】Flutter Gallery 官方示例简介 ( 项目简介 | 工程构建 )
  4. 【计算理论】计算复杂性 ( 3-SAT 是 NP 完全问题 | 团问题是 NP 完全问题 | 团问题是 NP 完全问题证明思路 )
  5. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)
  6. 【前端词典】如何向老板解释反向代理
  7. poj2441 Arrange the Bulls
  8. 手机数据抓包以及wireshark技巧
  9. (转)✈工欲善其事,必先利其器✔™
  10. 关于实验中的makefile相关知识