随便记录一次数据结构与算法的分析作业,内容为分析循环和递归实现输出1-N的正整数的对比。从时间和空间上分析了两种方式实现的递归方法和循环区别。

一、数据记录图表





二、分析

第一张图表制作时由于在打游戏(滑稽),所以中间部分的数据偏高且无规律,后半段是挂着跑了一个晚上的结果,后面几张图都是在没有运行其他CPU占用大的程序所记录的,都可以看出无论是递归的还是循环,在运行时间上都与数据量N成明显的线性关系(中间的突变后面分析)。

由于受电脑使用和电脑性能的限制,没有跑非常大的数据,最大只跑到了400w,在所测数据内,递归和循环的运行时间没有较大区别。

在表中可以看到有部分地方时间发生了突变,一开始我也不知道具体原因,后猜测时由于测试时时间过长,系统屏保息屏和我唤醒屏幕导致,所以有了第四张图表,该表是在不息屏的情况且把输出窗口置顶测得(中间的断崖时由于前部分在导出视频所致)。为了严谨,取后部分数据进行比较,具体数据如图

图中第一列为数据量,第二三列为用时,长的那张图为不关闭显示所用时间(单位:s)。
可以看出不关闭显示的情况下数据输出的时间明显大于关闭显示窗口输出时间,个人认为这应该是windows中刷新屏幕的机制吧,屏幕看不到的地方就不刷新吗,所以用时短。

接下来就是内存的使用了,最后一张图非常完美的一条直线不用多说了,递归的内存使用随数据量线性增加,而循环不存在返回上层调用的问题,也不会有线性增长的内存开销。

三、结论

在输出1-N的正整数的程序实现中,递归的方法和循环的方法在运行时间上没有明显区别,且都与数据量N成线性增加的关系,时间复杂度均为O(n)。但是递归在内存的使用量上与数据量也为线性增加关系,空间复杂度为O(n),循环则为O(1)。

总的来说这次试验还是挺有收获的,在之前有惯性思维递归肯定会比循环跑的慢,这次也算是验证了一下,不过递归的内存开销确实大,这大概就是为什么尽量要把递归方法改为循环实现吧,不过递归确实在一些问体的实现上较循环容易。

还有一个未解的疑问,望大佬指点:所有的测试刚开始跑第一个数据的时候时间总是会偏高,而且先跑哪个哪个就变高,图中也可以明显看出第一个数据很奇怪,不太明白为什么,请教请教大佬们!!!

以上所有均为个人见解,如有不足或错误,欢迎提问指正。

四、附上实验用源代码
#include <stdio.h>
#include <time.h>#define N 20     //测试数据量
#define STEP 1000   //数据递增量//计时参数
clock_t start, stop;
double dt1, dt2;int *mem_start = NULL, *mem_stop = NULL, mem_used = 0, flag = 0;        //记录递归内存使用的一些参数//循环的实现方法
void print_n_loop(int n);//两种递归的实现方法
void print_n_recu1(int begin, int n);
void print_n_recu2(int n);int main()
{getch();   //按任意键开始//数据输出到文件FILE *loop_time = fopen("loop_time_1.txt", "w+");FILE *recu_time = fopen("recu_time_1.txt", "w+");FILE *recu_mem = fopen("recu_mem_1.txt", "w+");for (int i = 1; i <= N; i++){start = clock();print_n_loop(i * STEP);stop = clock();dt1 = (double)(stop - start) / CLK_TCK;flag = 1;start = clock();//print_n_recu1(1, i * STEP);print_n_recu2(i * STEP);stop = clock();dt2 = (double)(stop - start) / CLK_TCK;mem_used = (int)(mem_start - mem_stop);fprintf(loop_time, "%lf\n", dt1);fprintf(recu_time, "%lf\n", dt2);fprintf(recu_mem, "%d\n", mem_used);}fclose(loop_time);fclose(recu_time);fclose(recu_mem);return 0;
}void print_n_loop(int n)
{for (int i = 1; i <= n; i++)printf("%d\n", i);
}void print_n_recu1(int begin, int n)
{//内存计算 时间计算时注释/*if (flag){mem_start = &n;flag = 0;}if (begin > n)mem_stop = &n;*/if (begin > n)return;printf("%d\n", begin);print_n_recu1(++begin, n);
}void print_n_recu2(int n)
{//内存计算 时间计算时注释/*if (flag){mem_start = &n;flag = 0;}if (!n)mem_stop = &n;*/if (n){print_n_recu2(n - 1);printf("%d\n", n);}return;
}

记一次数据结构与算法作业:利用循环和递归输出1-N的正整数的程序分析比较相关推荐

  1. c语言编写队列元素逆置,数据结构与算法实验—利用栈逆置队列元素.doc

    数据结构与算法实验-利用栈逆置队列元素 利用栈逆置队列元素实验报告 通信1204班 谢崇赟 实验名称 利用堆栈将队列中的元素逆置 实验目的 会定义顺序栈和链栈的结点类型. 掌握栈的插入和删除结点在操作 ...

  2. Python数据结构与算法(4.1)——递归

    Python数据结构与算法(4.1)--递归 0. 学习目标 1 递归 1.1 递归的基本概念 1.2 递归的重要性 1.3 递归三原则 1.4 递归的应用 2 递归示例 2.1 列表求和 2.2 汉 ...

  3. 【典型习题整理】数据结构与算法作业

    数据结构与算法 图的邻接表和邻接矩阵表示法以及kruskal&prim算法求最小生成树 图的邻接表表示 概念如下:邻接表        其实我们大可以使用hashmap构建邻接表,但是为了深入 ...

  4. 数据结构与算法学习笔记4:递归+分治法

    数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...

  5. 数据结构和算法(第六章递归)

    数据结构和算法第六章递归 数据结构和算法第六章递归 文章目录 数据结构和算法第六章递归 前言 一.递归与回溯? 二.递归用于解决的问题 1.打印问题和阶乘问题回顾递归调用机制 2.递归--迷宫问题(小 ...

  6. 如何利用循环代替递归以防止栈溢出(译)

    摘要:我们经常会用到递归函数,但是如果递归深度太大时,往往导致栈溢出.而递归深度往往不太容易把握,所以比较安全一点的做法就是:用循环代替递归.文章最后的原文里面讲了如何用10步实现这个过程,相当精彩. ...

  7. 一步一步写算法(之循环和递归)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点 ...

  8. 一步一步写算法(之循环和递归)(转)

    其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就 ...

  9. 数据结构与算法作业3——约瑟夫环问题(循环链表)

     第二次作业: 习题2 载具杀手与时停高手(约瑟夫环问题) 著名绅士简尚夫有一项特殊的天赋,他可以摧毁任意一辆载具(载具杀手).他的朋友狄傲可以将时间暂停(时停高手).他俩玩一个游戏. 有N辆车,编号 ...

最新文章

  1. iOS一些实用的技巧
  2. html你可能还不知道的一些知识点
  3. 使用Logstash filter grok过滤日志文件
  4. 关于Android手机CPU不同架构的问题
  5. 第4章 变量、作用域和内存问题
  6. B树、B-树、B+树、B*树【转】,mysql索引
  7. 鱼不长肢蛇不长脚,多多益善更烦恼?人猴嵌合肥胖有救,生活还要压力要小!...
  8. ueditor使用小结
  9. WPS配置工具参数 ksomisc.exe
  10. 计算机启动需输入两次密码,我的电脑开机的时候要输入2次密码,我应当怎么去除?...
  11. Python中如何获取类属性的列表
  12. webstorm界面主题
  13. IOMeter存储测试工具
  14. ln命令 Linux软连接(Symbolic Link)和硬链接(Hard Link)
  15. java搜索引擎框架_搜索引擎框架介绍
  16. 魏尔斯特拉斯函数 matlab,Applied Numerical Linear Algebra - James W. Demmel
  17. kaggle使用tpu
  18. 人工智能AI讲师NLP培训讲师叶梓:人工智能之最新NLP自然语言处理技术与实战-23
  19. 美的华为鸿蒙,董明珠万没想到,格力终将被美的超越,华为鸿蒙“功不可没”...
  20. 数据库 MySQL-window安装和卸载

热门文章

  1. 新手必看:蓝牙耳机什么牌子的好用?2023年蓝牙耳机排名
  2. 按键精灵 android版运行异常,按键精灵安卓版 tap、touch命令 不好用的解决办法!...
  3. Python画地图数据可视化分析
  4. 公开「处刑」!波士顿动力的搬砖机器人,私下竟「翻车」不断
  5. LeetCode刷题遇到的小知识点总结
  6. 2019年上半年软件设计师下午试题
  7. Python pandas 染色体 SNP 位点提取 并排序
  8. Win7搜索之体验!
  9. 亚马逊救生衣UL1177/ 浮力背心UL1180怎么办理流程和费用?
  10. 每日英语--Week11