在递归中 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);
   }
}
}

评论

  1. 我觉得不用全局变量,用STATIC变量更好。貌似STATIC很少人用,在这里用一下也算是对STATIC有一个交待

    回复删除

发表评论

此博客中的热门博文

Linux/ARM Page Table Entry 属性设置分析

由RFE指令引发的一串故事

提交了30次才AC ---【附】POJ 2488解题报告