关于递归与循环

来源:互联网 发布:java中runnable的意思 编辑:程序博客网 时间:2024/05/16 13:05

在做CSCI 570 算法设计的 sudoku 回溯算法时,开始用递归总报 stack overflow 错误,上课都没心思听了。看了05年一篇关于堆栈溢出的帖子。有人说递归一般可以用循环来替代。

下课后尝试一下,一试就成功了,效果很好啊,以后当递归层次非常数级别时,最好还是用循环吧!

 

递归代码:

void sudoku(int i,int j,bool back)

{

if(S[i].status==true)

{

if(available(i,S[i].list[j])&&j<S[i].length){

//cout<<S[i].list[j]<<" is ok in "<<i<<" j is "<<j<<endl;

S[i].key=S[i].list[j];

S[i].pos=j;

i++; 

j=0;

sudoku(i,j,false);

}else if(j<S[i].length)

{

//cout<<S[i].list[j]<<" cannot in "<<i<<" j is "<<j<<endl;

j++;

sudoku(i,j,false);

}else{

S[i].key=0;

i--;j=0;

if(S[i].status==true)

S[i].key=0;

sudoku(i,S[i].pos+1,true);

}

 

}else if(i<82&&i>=1)

{   

if(back==false){

i++;

sudoku(i,0,false);}

else

{

i--;

sudoku(i,S[i].pos+1,true);

}

}

}

 

循环代码:

void sudoku2(int i,int j,bool back)

{

while(i<82)

{

if(S[i].status==true)

{

if(available(i,S[i].list[j])&&j<S[i].length){

//cout<<S[i].list[j]<<" is ok in "<<i<<" j is "<<j<<endl;

S[i].key=S[i].list[j];

S[i].pos=j;

i++; 

j=0;

back=false;

continue;

}else if(j<S[i].length)

{

//cout<<S[i].list[j]<<" cannot in "<<i<<" j is "<<j<<endl;

j++;

back=false;

continue;

}else{

S[i].key=0;

i--;j=0;

if(S[i].status==true)

S[i].key=0;

back=true;

j=S[i].pos+1;

continue;

}

}else if(i<82&&i>=1)

{   

if(back==false){

i++;

j=0;

continue;}

else

{

i--;

j=S[i].pos+1;

back=true;

continue;

}

}

}

}

原创粉丝点击