2009年(41)
分类: C/C++
2009-04-13 11:43:05
总所周知,写递归程序很省心,只要写出公式,找出边界情况,只需要很少的代码(相比非递归)就能够实现功能。
但是,在递归层数比较多的情况下,递归的效率一般情况下会比非递归方式要低,因为递归的函数调用开销是不可忽视的。另外,某些系统不支持很长的函数调用链(栈太小),采取递归的方式不可行。消除递归在某些情况下是很有必要的。
递归之所以省心,是因为大多数状态都由函数调用栈帮你维护,你只需关注当前层的处理即可。所谓的消除递归,就是不利用函数调用来维护状态,而是自己维护。因此,消除递归的关键就是找到要维护的状态,然后自己模拟一个栈记录状态。比如:
|
至于这些状态是什么,自己分析一下递归函数的函数体应该很容易就能找出来。