在递归中 break的技巧!
由于递归有两种特性,所以它在深度搜索中用的比较多:
1、属于不撞南墙不回头的类型,必须给它一个if()条件,让它回头。
2、具有即使计算正确,也要把所有的路径全部走完的大无畏无私精神。
因此,在当我们不需要全部的计算结果,仅仅需要一个数值的时候,我们需要在当它计算出结果后,需要将之从繁琐嵌套的递归中解脱出来(就像是循环中的break!)。
在练习中,发现可以设置一个布尔变量达到目的:
例如:
void dfs(int c, int s)
{
if(!s && !ac)
{
ac = 1; //DFS的一个全局变量,如果ac已经ac了
//,那么就不用再计算了,如果没有这个数,那么要把所有的结果显示出来
for(int i = 0; i < c; i ++)
{
printf("%d", a[i]);
}
printf("\n");
}
else
{
if(c < 100 && !ac)
{
a[c] = 1;
dfs(c + 1, (s * 10 + 1) % n);
//返回后,还要继续往下试探!!,真TM执着!
a[c] = 0;
dfs(c + 1, (s * 10) % n);
}
}
}
我觉得不用全局变量,用STATIC变量更好。貌似STATIC很少人用,在这里用一下也算是对STATIC有一个交待
回复删除呵呵,static也可以
回复删除