具体原理就是用多层数据代替栈堆,循环实现函数调用。
步骤是:
1,先实现对应递归函数
2,定义足够多层的数据,其中
数据类型{
对应递归函数的输入数据;
对应递归函数的输出数据;
运行步之间有联系的数据;
};
3,循环实现对应递归函数每一步,其中
对应递归函数的调用=跳进下一层数据,从第一步
对应递归函数的返回=没有上一层?结束循环:(返回上一层数据,从下一步开始);
下面是3个具体实例的图解:
char*utoa(char*a,u32 u,u32 r){
u32 div=u/r;
if(div)a=utoa(a,div,r);
u32 mod=u%r;
char*b=a;
*b++=mod<10?mod+'0':mod-10+'a';
*b=0;
return b;
}
int main(){
{
char a[100]={};
utoa(a,12345,10);
outs(a);
}
struct lt{
int i;
char*a,*b;
u32 u,r;
void init(char*a,u32 u,u32 r){
this->a=a;
this->u=u;
this->r=r;
i=0;
}
lt*run(lt*la){
int ii=0;
if(i==ii++){
u32 div=u/r;
if(div){
lt&l=this[+1];
l.init(a,div,r);
return &l;
}else{
i+=2;
}
return this;
}
if(i==ii++){
a=this[+1].b;
i++;
return this;
}
if(i==ii++){
u32 mod=u%r;
b=a;
*b++=mod<10?mod+'0':mod-10+'a';
*b=0;
if(this==la)return 0;
lt&l=this[-1];
l.i++;
return &l;
}
}
}la[100];
lt*l=la;
char a[100]={};
l->init(a,0x1a2b3c4d,16);
while(l=l->run(la));
outs(a);
return 0;
}
void nabc(int n,char a='a',char b='b',char c='c'){
if(n>1)nabc(n-1,a,c,b);
if(n>0)printf("%8i:%c->%c\n",n,a,c);
if(n>1)nabc(n-1,b,a,c);
}
int main(){