为什么这段递归代码能遍历所有情况? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
spencerqiu
V2EX    C

为什么这段递归代码能遍历所有情况?

  •  
  •   spencerqiu 2015-10-09 19:25:50 +08:00 1801 次点击
    这是一个创建于 3658 天前的主题,其中的信息可能已经有所发展或是发生改变。
    int dfs(int i,int sum) { if(i==n+1) return sum==k; if(dfs(i+1,sum)) return 1; if(dfs(i+1,sum+a[i+1])) return 1; } 

    这段代码是计算能否从数组 a 中找到任意个数,使其和等于 k 的。难道搜索树从最左边走到底的时候,如果 sum != k 不已经 return 0 了么 ... 为什么程序还能继续跑呢?

    return 我理解 ... 就是退到上一个递归的情况,但是为何 return 的是 0 之后依然还能遍历全部搜索树呢?

    9 条回复    2015-10-10 00:15:05 +08:00
    KotiyaSanae
        1
    KotiyaSanae  
       2015-10-09 19:36:16 +08:00
    因为 sum != k 只是结束了一个递归栈帧呐,主程序会继续执行接下来的代码。
    KotiyaSanae
        2
    KotiyaSanae  
       2015-10-09 19:40:37 +08:00
    这个解法其实就是讨论两种情况,一种是取接下的元素,一种不取,你可以认为是一颗二叉树,程序实际上在进行后序遍历
    KotiyaSanae
        3
    KotiyaSanae  
       2015-10-09 19:54:36 +08:00
    @KotiyaSanae 前序……
    spencerqiu
        4
    spencerqiu  
    OP
       2015-10-09 20:16:07 +08:00 via iPad
    @KotiyaSanae
    那么如果在遍历到最右边一个子节电之前,已经遍历到了答案,会直接退出程序?
    spencerqiu
        5
    spencerqiu  
    OP
       2015-10-09 20:16:20 +08:00 via iPad
    退出函数 …
    KotiyaSanae
        6
    KotiyaSanae  
       2015-10-09 20:27:16 +08:00
    @spencerqiu 对啊,很容易分析吧……最简单的情况, k 是 0 的话,就只会沿着最左边的路径走下去,然后退出,返回 1
    spencerqiu
        7
    spencerqiu  
    OP
       2015-10-09 20:48:59 +08:00
    @KotiyaSanae
    大概是最后一个问题, return 、 return 0/1 、 return sum==k 的区别?

    return 是返回上一层递归。

    return 0/1 是返回 0/1 给主程序,并且不再返回上一层递归?

    return sum==k 呢?

    唉 ... 越来越云里雾里了 ...
    KotiyaSanae
        8
    KotiyaSanae  
       2015-10-09 23:14:04 +08:00
    @spencerqiu return 就是 return 啊,终止当前的调用栈,控制权交还给调用方,不管 return 什么,意义都是这个。 return 、 return 0/1 、 return sum==k ……唔?除了返回的值不一样,哪有啥不同。
    个人觉得你是对递归不熟……递归一层一层压栈,然后每一次 return 弹出当前的栈帧,就是这样。
    hienchu
        9
    hienchu  
       2015-10-10 00:15:05 +08:00 via iPhone
    @spencerqiu return 在 cpp 里就是退出当前函数,也就是 stack 上的当前 frame,跟退出当前程序(process)没直接关系
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3565 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 04:31 PVG 12:31 LAX 21:31 JFK 00:31
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86