1. 递归有点像盗梦空间。。。
每做一次递归就深入一层,如果某一层递归里满足某条件要return,就return到上一层递归语句,执行它的下一行,以此类推。
如素数环问题(部分):
void DFS(int num)
{
... ... ;
for(int j=2; j<num; j++)
{
if(!isPrime(ans[j-2]+ans[j-1])) { return; } //如果不是素数,返回继续枚举
}
for(int i=1; i <= n; i++)
{
if(circle[i]==false)
{
circle[i]=true;
ans[num]=i;
DFS(num+1); //递归枚举
circle[i]=false;
} } }
比如,num==4时,在嵌套里执行DFS(num+1),即DFS(5);
若此时不满足素数条件要return,return到circle[i]=false;
若此时满足for循环退出条件,说明DFS(4)的递归结束,返回到DFS(4)调用处(注意此时不是返回到main函数,而是一层一层递归,一层一层深入,一层一层浅出);
此时DFS(4)为DFS(3+1),num==3;
以此类推。
2. 解决素数环用回溯法枚举每一个值,分为两步:
第一,当第一个数位为1确定时,尝试放入第二个数,判断这两个相邻数的和是否为素数,若满足条件,再放入第三个数&#