关于递归与循环
来源:互联网 发布: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;
}
}
}
}
- 关于递归与循环
- 关于循环与递归的选择
- 关于递归和循环
- 循环与递归
- 循环与递归
- 循环与递归
- 循环与递归
- 递归与循环
- 递归与循环
- 循环与递归
- 递归与循环
- 递归与循环比较
- 循环与递归
- 递归与循环
- 蓝桥杯-递归与循环
- 递归与循环
- 数据结构-递归与循环
- JavaScript的递归之递归与循环
- 《设计原本》读书笔记:梦想
- 《设计原本》读书笔记:卓越的设计师 及 其它
- Microsoft Visual Studio 2010注册 KEY//=VisualDDK- VS2010驱动环境//=//VS2010完整版安装 瘦身 精简 提速方法//
- 在windows server 2008 R2上配置PHP(zend framework框架)遇到的问题
- 计算多少年能否买到房
- 关于递归与循环
- install mysql under ubuntu
- 网上同学录设计下载
- install apache2, php, mysql under ubuntu
- oracle 中使用单引号(')和双引号(")
- 遍历josn的三种方式
- 新的开始,以终点为起点
- UC(Unified Communication)统一通讯故事 2011-4-20
- 面向对象