递归转非递归理解

来源:互联网 发布:js array indexof ie8 编辑:程序博客网 时间:2024/05/04 11:04

可以使用下面这几种方法来实现递归到非递归的转换.

(1) 循环方法
循环方法是所有递归到非递归的转换中最理想的方法,可以将开销减少到最小.
不过也是分析起来最复杂的,对于简单的递归可以用这样的方法来处理.
例如:Factorial计算
这里回到n!(阶乘)定义上面来分析,这里将n!数学意思为n! = n*(n-1)! & 1!=1;做一个扩展可以到到n!另外一个表示方法n! = n*(n-1)*(n-2)*....*1;
这样就可以很容易得到另外一个定义:
n!表示执行n次循环计算一个增量k,初始k=1和结果t=1;每次t乘以k++的值.
ISO C++实现代码如下:

Factorial(int n){   int k = 1 ;//增量   int t = 1 ;//临时结果   while(k!=n){      t*=k;      k++;   }   return t;}



这样可以避免递归带来的大量堆栈操作.

(2) 自定义堆栈
对于复杂逻辑的堆栈操作,需要借助外部堆栈来实现.
因为对于所有的递归操作最后分析出来都是形成的一颗树形结构.
下面是一个递归实现Factorial的一个方法,虽然在这个程序中对比循环来相对复杂,不过对于一些不能分析出来循环的递归操作来说自定义堆栈的方法可以达到空间开销可控.

Factorial(int n){   Stack s;   int t = 1;//临时变量   s.push(n);   while(s.top()!=1)[      t *= s.top();      s.push(s.top()-1);      s.pop();   }   return t;}

除了上面这两种方法外,还可以使用一种迭代的方法实现递归到非递归的处理.




原创粉丝点击