递归——迭代是人,递归是神
递归,就是自己调用自己。
首先,需要搞清楚函数是如何调用的。在执行被调函数之前,系统需要做3件事:
1.将实参,函数的返回地址等信息传递给被调函数保存。
2.为被掉函数的形参,局部变量分配空间
3.将控制转移到被调函数入口。
当从被调函数返回前,也需要做3件事:
1.保存函数的返回结果
2.释放被调函数存储空间
3.按照被调函数保存的返回地址将控制转移给调用函数。
其中主调函数和被调函数间的参数传递和控制转移是通过栈来实现的:计算机只能操作栈顶元素。当调用被掉函数时,将被调函数的数据空间压栈,则即将控制权转移给了被掉函数;当函数结束时,被调函数出栈,则控制权又返回给了主调函数。
从此可以看出,计算机程序调用别的程序和调用自己是没有区别的,同样都是做上述事情。
与一般的迭代相比递归有这么几个特点:
1.递归更贴近于人的“逆向思维”,而迭代却是不动脑子的直接做。
2.从程序的复杂度上来说,递归比较短小,而迭代会比较长。
3.从执行效率来讲,递归效率低(因为函数调用要做许多事),而迭代效率较高。
4.当程序中有bug时,迭代的错误往往容易发现,而递归的错误找起来却很费力。
到底什么时候用递归,什么时候用迭代的呢?如果你想少用一点自己脑子,而让计算机多累一点,那么就用递归;如果你想让自己考虑清楚所有的步骤,计算机直接照着执行,那么就用迭代。
其实,并不是所有的问题都能转化成递归问题的,当使用递归分析问题时,必须保证递归以后,问题的本质没有发生变化,但是规模减小了,而且当规模小到一定程度时,我能求解他。
To iterate is human,to recurse divine.—— L. Peter Deutsch
迭代是人,递归是神。
递归——迭代是人,递归是神相关推荐
- 什么是递归迭代?新递归迭代是什么呢?
[事物的隶属度往往具有时效性和空效性,即动态变化的隶属性:逻辑,尤其是组合逻辑也有时空变化性,时间一长,空间一变,就变成了非逻辑系统:集合概念中各元素的确定性.互异性.无序性在人机态势感知中都会不断变 ...
- 二叉树的中序遍历 [递归 迭代]
中序遍历的递归 & 迭代 前言 一.二叉树的中序遍历 二.递归 & 迭代 1.递归版 2.迭代(断左子树版) 3.迭代(root迭代版) 4.mirror(O(1)空间版) 总结 参考 ...
- 迭代是人,递归是神(迭代与递归的总结:比较)
https://www.cnblogs.com/Renyi-Fan/p/7708012.html 在计算机编程实现中有常常两种方法:一曰迭代(iterate):二曰递归(recursion). 从&q ...
- 2016-12-29 DNS简介上 域名空间、域、迭代解析、递归解析、DNS服务器
2016-12-29 DNS简介上 域名空间.域.迭代解析.递归解析.DNS服务器 Domain name system 域名系统(Domain Name System,DNS)是把名字映射到 ...
- 通过迭代(非递归)及递归将单链表逆序
通过迭代(非递归)及递归将单链表逆序 老生常谈的问题了,不过很多地方面试还是很喜欢问这个问题.实际工程中感觉用处不大,需要逆序的存储为什么要选择单链表呢?为什么不用list(in c++)或itera ...
- leetcode144. 二叉树的前序遍历(递归+迭代)
一:题目 二:上码 1:递归 class Solution {public:void preorder(TreeNode* root,vector<int>&v ) {if(roo ...
- [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]
[问题描述][] 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输 ...
- [递归|迭代] leetcode 21 合并两个有序链表
[递归|迭代] leetcode 21 合并两个有序链表 1.题目 题目链接 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2 ...
- Leetcode-148-排序链表(递归+迭代)
问题描述: 思路: 拿之前那道"对链表插入排序"的代码可以直接通过,但是不符合题目的要求:时间复杂度控制在O(nlogn),插入排序时间复杂度在o(n^2),又因为此时是对链表不是 ...
最新文章
- mysql pdo 查询一条数据_pdo mysql怎么输出第1条 第4条 第7条数据
- 在数字时代,如何成为一个真正有身份的人?
- WinAPI: PtInRect - 判断点是否在矩形中
- kafka在zookeeper中存储结构
- RecyclerView notifyItem闪屏问题
- oracle修改字段名称 试图删除被依赖列_oracle 添加 删除列 修改表名字 ;加注释 异常解释...
- 队列的应用、栈的应用
- 网站架构相关PPT、文章整理
- 2017.3.26 最长双回文串 思考记录
- jquery-pager的使用
- crm创建启用停用用户
- Windows SharePoint Services Search和Office SharePoint Server Search的区别
- 计算机软件丛书,开天辟地学电脑丛书——办公软件篇
- 在linux中加固mysql_linux安全加固十六法则
- 什么是servlet及其生命周期
- 分享一个2.4G无线麦克风音频接收器的成功案例
- AutoCAD Civil 3D-装配(标准横断面)
- Windows 10 输入法莫名其妙变为繁体的解决方法
- Xenu Link Sleuth
- 中国阀门驱动装置行业运行状况与前景趋势研究报告2022-2028年