Chinaunix首页 | 论坛 | 博客
  • 博客访问: 118418
  • 博文数量: 41
  • 博客积分: 2564
  • 博客等级: 少校
  • 技术积分: 455
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-20 19:17
文章分类

全部博文(41)

文章存档

2009年(41)

我的朋友

分类: C/C++

2009-04-13 11:43:05

    总所周知,写递归程序很省心,只要写出公式,找出边界情况,只需要很少的代码(相比非递归)就能够实现功能。

    但是,在递归层数比较多的情况下,递归的效率一般情况下会比非递归方式要低,因为递归的函数调用开销是不可忽视的。另外,某些系统不支持很长的函数调用链(栈太小),采取递归的方式不可行。消除递归在某些情况下是很有必要的。

    递归之所以省心,是因为大多数状态都由函数调用栈帮你维护,你只需关注当前层的处理即可。所谓的消除递归,就是不利用函数调用来维护状态,而是自己维护。因此,消除递归的关键就是找到要维护的状态,然后自己模拟一个栈记录状态。比如:

...
int lv; //表示当前层

int stack[max] //模拟栈,max为最大层数,也就是递归方式中的最大递归次数


...
//递归时:
......//当前层的必要处理

stack[lv]=[当前状态];
lv++;
......

//回溯时
......//当前层的必要处理

lv--;
从stack[lv]恢复状态

至于这些状态是什么,自己分析一下递归函数的函数体应该很容易就能找出来。

阅读(2269) | 评论(0) | 转发(0) |
0

上一篇:全排列

下一篇:Unix网络编程指南

给主人留下些什么吧!~~