基础算法(十) --- 递归法
来源:互联网 发布:xp怎么禁止安装软件 编辑:程序博客网 时间:2024/06/03 05:36
递归法是一种直接或者间接地调用自身算法的过程。
什么时候使用递归呢?一般而言,如果发现当前的问题,可以用一个跟它本身策略一样的一个子问题的结果来计算的时候。如果恰好在最后一步中,有一个明确的递归结束条件(称为递归出口)。那么,就是递归使用的时机到了。
递归有时候并不太明显,函数可能被间接嵌套。用递归写的代码非常简洁,也非常容易理解。在有些嵌入式应用里,如果当前的硬件比较糟糕,函数的运行栈非常小的话,就要消递归,因为递归的嵌套容易导致函数栈的溢出。但是消递归后的代码,显得就比较乱了,完全没有递归代码的简洁。
递归是一种比较好的解决问题的思路,尤其在操作树这样的数据结构的时候。
Example 1:
删除一棵树上的所有节点。大家可以这样思考,要删除顶节点,就要删除顶节点下的所有直接的子节点,而子节点同样需要删除它们自己的所有直接的子节点,直到当前的节点是叶子节点。这个就是一个非常典型的递归过程,递归函数则是:如果当前节点是叶子节点则删除自己,然后返回;反之则调用递归函数删除自己的子节点,然后删除自己,返回。
Example 2:
WINDOWS UI控件的消息传递机制。控件都实现了相同的事件处理接口,父控件需要根据子控件处理事件的结果来进行自己的一系列处理。递归思路为:在当前控件的事件处理函数中,如果当前的控件有子控件,则调用子控件的事件处理函数,然后根据返回值接着处理,完毕之后返回处理标记;反之则直接处理,返回处理标记。
什么时候使用递归呢?一般而言,如果发现当前的问题,可以用一个跟它本身策略一样的一个子问题的结果来计算的时候。如果恰好在最后一步中,有一个明确的递归结束条件(称为递归出口)。那么,就是递归使用的时机到了。
递归有时候并不太明显,函数可能被间接嵌套。用递归写的代码非常简洁,也非常容易理解。在有些嵌入式应用里,如果当前的硬件比较糟糕,函数的运行栈非常小的话,就要消递归,因为递归的嵌套容易导致函数栈的溢出。但是消递归后的代码,显得就比较乱了,完全没有递归代码的简洁。
递归是一种比较好的解决问题的思路,尤其在操作树这样的数据结构的时候。
Example 1:
删除一棵树上的所有节点。大家可以这样思考,要删除顶节点,就要删除顶节点下的所有直接的子节点,而子节点同样需要删除它们自己的所有直接的子节点,直到当前的节点是叶子节点。这个就是一个非常典型的递归过程,递归函数则是:如果当前节点是叶子节点则删除自己,然后返回;反之则调用递归函数删除自己的子节点,然后删除自己,返回。
Example 2:
WINDOWS UI控件的消息传递机制。控件都实现了相同的事件处理接口,父控件需要根据子控件处理事件的结果来进行自己的一系列处理。递归思路为:在当前控件的事件处理函数中,如果当前的控件有子控件,则调用子控件的事件处理函数,然后根据返回值接着处理,完毕之后返回处理标记;反之则直接处理,返回处理标记。
- 基础算法(十) --- 递归法
- overview_java(十)-递归算法
- Java基础--递归算法(递归结构)
- 算法基础三 递归法
- 基础算法(零)---递归
- 基础算法--递归算法
- 十大基础算法
- 十大基础算法
- 十大基础算法
- 十大基础算法
- 十四周 项目一 验证算法(递归折半查找)
- 基础算法--递归(一)
- 基础算法--递归(二)
- Java 算法基础 -递归
- 基础算法:递归
- Java基础--递归算法
- 算法基础--递归
- 算法基础之递归算法
- VC应用程序快捷方式带参数
- PHP引用(&)使用详解
- Memcache调优
- 【每日一练】】(第7期)C++编程规范之类的设计2
- iOS下ffmepg开发的一些参考资料汇总(陆续更新)
- 基础算法(十) --- 递归法
- shell脚本
- 引导方式有哪些?LILO和GRUB的区别是什么?
- Qt 调用外部exe的方法
- 马云周星驰天马行空对话:梦想需要新鲜感
- shell 字符串截取
- Three20开发的应用,为什么不旋转?
- 【IOS游戏开发】知识普及之UDID
- mac上的终端bash命令基础