V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
spencerqiu
V2EX  ›  C

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

  •  
  •   spencerqiu · 2015-10-09 19:25:50 +08:00 · 1437 次点击
    这是一个创建于 3336 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   5403 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:19 · PVG 16:19 · LAX 00:19 · JFK 03:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.