您的位置:首页 > 其它

递归改非递归练习加总结

2012-07-18 08:07 309 查看
今天写了10个数字排列成环,相邻数字之和为素数的搜索题目,并由此总结递归改写非递归的模式

经过两个题目的比较后发现,不应该提出过于细节的模型,模式化到吧递归的搜索树的形式掌握,记住模拟堆栈中记录的是搜索进行状态,终止深度是搜索树的深度,以此两点,结合题目具体条件节能完成要求

带有回溯部分的题目,回溯是在循环开始时先判断搜索横向状态是否还有未进行的,如果没有的话就倒退一步,切记把数据所有标记还原初始状态,有事不止一个数据

递归代码:

[code]#include<cstdio>

#include<cstring>

usingnamespacestd;

constboolsimp[]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0};

booluse[11];

ints[11];

intlen=0,step;

voidsearch(intstep)

{

if(step==11)

{

if(simp[s[1]+s[10]])

{

for(inti=1;i!=11;i++)

printf("%d",s[i]);

printf("\n");

}

}else

{

for(inti=2;i!=11;i++)

if(!use[i]&&simp[s[step-1]+i])

{

use[i]=1;

s[step]=i;

search(step+1);

use[i]=0;

}

}

}

intmain()

{

freopen("output.txt","w",stdout);

memset(use,0,sizeof(use));

use[1]=1;

s[1]=1;

search(2);

return0;

}

[/code]

非递归代码:

[code]#include<cstdio>

#include<cstring>

#include<stack>

usingnamespacestd;

constboolsimp[]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0};

booluse[11];

ints[11];

intdep,step;

intmain()

{

memset(use,0,sizeof(use));

for(inti=2;i<=10;i++)

s[i]=1;

use[1]=1;

s[1]=1;

dep=2;

step=1;

while(dep!=1)

{

step++;

if(step>10)

{

use[s[dep]]=0;

s[dep]=1;

dep--;

if(dep>1)

step=s[dep];

}else

for(inti=step;i<=10;i++)

{

if(!use[i]&&simp[s[dep-1]+i]&&dep<=10)

{

if(dep==10)

{

if(simp[s[1]+i])

{use[i]=1;

s[dep]=i;

for(intj=1;j<=10;j++)

printf("%d",s[j]);

printf("\n");

}

}else

{

if(s[dep]!=1)

use[s[dep]]=0;

use[i]=1;

s[dep]=i;

dep++;

step=s[dep];

}

break;

}

step=i;

}


}

return0;

}

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: