利用尾递归减少栈空间的消耗
来源:互联网 发布:软件项目保密管理制度 编辑:程序博客网 时间:2024/05/17 06:38
利用尾递归减少栈空间的消耗
分类: 算法2013-08-30 16:04 482人阅读 评论(3) 收藏 举报
递归栈编译器算法优化
首先,需要给出一个定义,什么是尾递归。在《算法精解》中给出的定义如下:
如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归的。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数编译器会利用这个特点自动生成优化的代码。
看完上面这段描述,是不是觉得和没说差不多,看不明白。好吧,那就看看下面这张图吧。
这张图的左面是正常的递归,我们可以看到,越往深一层(即函数自身被调用一次),栈就要被多消耗掉一部分空间。而右边这张图,只有两次递归需要用到不同的栈空间,其余都是上次的空间被直接覆盖掉。
下面,我们利用普通的递归和尾递归计算一个表达式:
1 + 1/2 + 1/3 + 1/4 + .... + 1/n
代码如下:
- #include <stdio.h>
- double pi(double n);
- double pitail(double n, double a);
- int main(int argc, char *argv[])
- {
- printf("%lf\n", pi(5));
- printf("%lf\n", pitail(5, 0));
- return 0;
- }
- double pi(double n)
- {
- if (n == 0) {
- return -1;
- } else if (n == 1) {
- return n;
- } else if (n > 1) {
- return pi(n-1) + 1/n;
- }
- }
- double pitail(double n, double a)
- {
- if (n == 0) {
- return -1;
- } else if (n == 1) {
- return a + 1;
- } else if (n > 1) {
- return pitail(n-1, a + 1/n);
- }
- }
两种方法得到的结果当然是相同的。
0 0
- 利用尾递归减少栈空间的消耗
- 利用尾递归减少栈空间的消耗
- 递归:尽量减少不必要的递归消耗方式
- 减少Firefox的内存消耗
- 如何减少idea的内存消耗
- 减少电力消耗
- 在使用INV中如何减少内存的消耗
- 如何让Jmeter压力测试减少压力机的资源消耗
- 如何是你的app减少流量消耗
- 控制RMAN的备份时间,减少IO消耗
- 减少网卡中断收包产生的CPU消耗
- Oracle之利用函数索引减少递归调用
- 树的前中后遍历,利用递归,非递归,利用栈、、
- c#缓存机制,用于大批量连接数据库的性能优化,可减少对数据库的消耗。
- 递归算法空间的缩减方法与尾递归
- 找出是什么消耗了最多的UNDO空间
- memset会显著增加时间和空间的消耗吗
- 安卓开发,listview的优化,减少内存消耗,复用convertView、ViewHolder和分页加载
- 在线jsp版泰囧表情的生成器代码,不用PS也能恶搞。
- 工作中如何表现
- WSDL详解
- 国务院召开春季农业生产暨森林草原防火工作会
- 周杰伦《稻香》
- 利用尾递归减少栈空间的消耗
- IOS开发进阶精华贴索引
- 堆排序
- 使用Stopwatch类计算代码运行时间
- JavaWeb:报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
- 克里米亚正式加入俄罗斯联邦
- 线程私有存储空间--pthread_key_t
- PL/SQL_处理例外2(非预定义异常、自定义异常)
- SSH的端口转发:本地转发Local Forward和远程转发Remote Forward