为了理解递归写的。真想求Fibonacci前n项,迭代是更好的选择,简单并且速度快。另外,注意一下溢出问题。

递归算法速度慢的原因

递归调用本身需要使用系统栈,每次分配函数内存以及栈都需要时间.不过这个过程耗时并不多,可以说,单纯的递归本身并不比非递归慢多少.
然而,实践中就会发现,递归处理部分问题,特别是递推类问题时会表现出效率极低.这个问题的出现是因为重复计算.
举例说,用递归求解斐波那契数列的第n项,一般的递归公式为

f(n) = f(n-1)+f(n-2)
f(2) = 1
f(1) = 1

请尝试模拟计算机运行这个递归,你会发现,其中的某一项f(x)并不是只算了一次. 当你计算f(5)的时候,你会试图计算f(4)和f(3),然而在你计算f(4)的时候其实也要计算f(3),这样f(3)就被调用了两次.
计算Fibonacci(5)为例:

从上图可以看出,在计算Fib(5)的过程中,Fib(1)计算了两次、Fib(2)计算了3次,Fib(3)计算了两次,本来只需要5次计算就可以完成的任务却计算了9次。这个问题随着规模的增加会愈发凸显,以至于Fib(1000)已经无法再可接受的时间内算出。
想象这个过程是指数型扩展的,效率会随着n的增大极快地下降.
要解决这个问题,可以使用记忆化思想.
定义记忆数组r,函数体改为:

define f(n):
if r[n] is defined, then simply return r[n] as the answer.
else, f(n) = f(n-1) + f(n-2)
before return the value, take it down in r[n].

如此改进之后的递归函数效率上与递推算法相差无几.

递归代码

到后面计算速度巨慢

运行效果

计算斐波那契数列的前多少项?(输入过大可能溢出)
30
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 请按任意键继续. . .

//输入一个数num,打印斐波那契数列的前num项
#include<iostream>
using namespace std;
int fib(int num)//n是当前项的值,num是当前项数
{if (num<=1)return 1;else return  fib(num - 1) + fib(num - 2);
}
int main()
{//输入int num;cout << "计算斐波那契数列的前多少项?(输入过大可能溢出)\n";cin >> num;//计算并输出int i;for (i = 0; i < num; i++){cout << fib(i) << ' ';}system("pause");
}

迭代代码

几乎瞬间计算出来

运行效果

计算前多少项?
50
2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 2971215073 4807526976 7778742049 12586269025 请按任意键继续. . .

//打印斐波那契前n项
#include<iostream>
using namespace std;
int main()
{//输入int num;cout << "计算前多少项?\n";cin >> num;//计算long long int a[50] = { 1,1 };int i;for (i = 2; i < num; i++){a[i] = a[i - 1] + a[i - 2];cout << a[i] << ' ';}system("pause");
}

算法设计与分析(第三周)递归/迭代求Fibonacci前n项 【以及递归算法速度慢的原因】相关推荐

  1. PHP第五周答案,算法设计与分析第五周作业——Word Ladder

    算法设计与分析第五周作业--Word Ladder 上周找了一道深度搜索优先搜索的算法题来做,于是这周就选了一道广度优先搜索算法题来试试手. 本周所选题目:原题目链接 题目详情 题目大意:给出一个字符 ...

  2. 计算机算法设计与分析(第五版)---王晓冬--------前六章(递归与分治,动态规划,贪心算法,回溯法,)期末复习资料总结

    --1--  算法:解决问题的一种方法或者一个求解过程 是若干指令的序列 输入 输出 有限性 确定性 程序:用某种设计语言对算法的具体实现 可以不满足 有限性 程序 = 算法+数据结构 果子合并问题( ...

  3. 算法设计与分析第2章 递归与分治策略

    第2章 递归与分治策略 2.1 递归算法 递归算法:直接或间接地调用自身的算法. 递归函数:用函数自身给出定义的函数.两个要素:边界条件.递归方程 优点:结构清晰,可读性强,而且容易用数学归纳法来证明 ...

  4. 算法设计与分析之循环与递归

    前言: 循环与递归可以说是算法设计中最基本但却也是最重要的工具方法.循环和递归对于学习过高级程序设计语言的人来说都并不陌生,但还是有必要仔细的探究一下循环和递归之间的相似和区别.循环与递归最大的相似之 ...

  5. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

  6. 算法设计与分析 实验三 贪心算法

    一. 实验目的和要求 1.掌握贪心算法的基本思想. 2.学习利用贪心算法设计和实现算法的方法. 3.了解利用替换法证明贪心策略是否能获得全局最优解的过程. 4.熟练掌握贪心算法在两个典型图搜索中的应用 ...

  7. [XJTUSE 算法设计与分析] 第三章 动态规划 3.2 动态规划典型例题与解题思路(一)

    文章目录 3.2 动态规划典型例题与解题思路(一) 一.拆分类 1.矩阵连乘(极重要) 1)穷举法 2)动态规划法 3)备忘录方法 2.凸多边形最优三角剖分 ① 三角剖分的结构 ② 最优子结构性质 ③ ...

  8. 算法设计与分析 实验三 动态规划算法

    实验3.<动态规划算法实验> 一.实验目的 掌握动态规划方法贪心算法思想 掌握最优子结构原理 了解动态规划一般问题 二.实验内容 编写一个简单的程序,解决0-1背包问题.设N=5,C=10 ...

  9. [算法设计与分析]第三章练习题:删除多余括号

    问题描述 从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简.另外不考虑'+' '-'用作正负号的情况, ...

最新文章

  1. 诺基亚n73支持java_JAVA性能 vs 诺基亚N71、E61_诺基亚 N73_手机其它OS-中关村在线
  2. 程序员基本功03常见JAVA集合的实现细节
  3. 如何通过 C# 判断某个 IP 是否属于某IP段?
  4. 企业网站 源码 服务邮箱:_公司企业邮箱购买,外贸企业邮箱用哪家服务好?
  5. 【转】C# Socket编程笔记
  6. 如何在 Mac 上忘记 Wi-Fi 网络?
  7. 方法二 、属性 CLR学习第九课
  8. POJ 3020 Antenna Placement(无向二分图的最小路径覆盖)
  9. Tri-training, 协同训练算法
  10. matlab基于dct的图像压缩编码解码_基于深度学习的视频压缩方法简介
  11. matlab gif生成器,Matlab制作视频并转换成gif动态图的两种方法
  12. python字体大小设置苹果电脑_如何调整Mac字体大小Mac字体大小调整方法
  13. Win11系统安装 WSA
  14. c语言生成二进制文件的步骤,C语言入门教程-二进制文件
  15. Android多媒体开发框架
  16. 什么是软件项目管理?
  17. CDH踩坑记录之:熵不足
  18. 数据库JDBC(知识点整理)
  19. Linux-常用快捷键
  20. Linux下Chelsio T5调试方法

热门文章

  1. oracle函数中bitand,Oracle bitand()函数使用方法
  2. Jenkins 设置镜像_docker+jenkins自动化部署
  3. Raw Socket编程
  4. 使用drawio进行画图真的很方便(WEB版/Chrome APP版/桌面版)
  5. 建议收藏 | 全面解析 50+条 SQL 语句性能优化策略
  6. Kafka最全面试题整理|划重点要考
  7. MySQL基础总结(一)
  8. 直播预告:与九位专家聊聊Codec和AOM Summit
  9. URL2Video:把网页自动创建为短视频
  10. 客观指标VS主观质量:拨开遮挡高清视频技术的迷雾