1.直接转换法
直接转换法通常用来消除尾递归和单向递归
//尾递归
long fact(int n){
if(n==0)return 1;
else return n*fact(n-1);
}
可以写成如下形式
long fact(int n){
int s=0;
for(int i=1;i<=n;i++)s*=i;
return s;
}
//单向递归
long f(int n){
if(n==0||n==1)return 1;
else return f(n-2)+f(n-1);
}
可以写成如下形式
long f(int n){
int i,s;
int s1=1,s2=1;
for(i=3;i<=n;i++){
s=s1+s2;
s2=s1;//保存f(n-2)的值
s1=s;//保存f(n-1)的值
}
return s;
}
2.间接转换法
该方法使用栈保存中间结果,其一般过程如下:
while(栈不为空){
退栈,将栈顶元素赋给s;
if(s是要找的结果)返回;
else{
寻找到s的相关状态s1;
将s1进栈
}
}
间接转换法在数据结构中有较多实例,如二叉树遍历算法的非递归实现,图的深度优先遍历算法的非递归实现等