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

为什么这个求全排列的函数递归边界不需要 return ?

  •  
  •   spencerqiu · 2015-07-28 23:06:55 +08:00 · 949 次点击
    这是一个创建于 3412 天前的主题,其中的信息可能已经有所发展或是发生改变。

    虽然加了 return 也并不影响结果...但是不加 return ,如何退到上一个状态中?如 n=3 ,不 return 为什么不只输出 1 2 3 就结束呢?

    void full_permutation(int n,int a[],int cur)
    {
        int i,j;
        bool ok;
        if(cur==n)
        {
            for(i=0;i<n;i++)
                cout <<a[i]<<" ";
            cout <<endl;
            //return;
        }
        else
        {
            for(i=1;i<=n;i++)
            {
                ok=1;
                for(j=0;j<cur;j++)
                {
                    if(a[j]==i)
                    {
                        ok=0;
                        continue;
                    }
                }
                if(ok)
                {
                    a[cur]=i;
                    full_permutation(n,a,cur+1);
                }
            }
        }
    }
    
    11 条回复    2015-07-29 10:51:00 +08:00
    hx1997
        1
    hx1997  
       2015-07-28 23:12:13 +08:00
    void 为什么要 return?

    而且不 return 也会在函数执行完后返回的啊。
    spencerqiu
        2
    spencerqiu  
    OP
       2015-07-28 23:14:41 +08:00
    @hx1997
    我对 return (不是 return 0 return 1 啥的)的理解是返回上一个状态= =,既然这样要 return; 这东西存在何用?
    loveuqian
        3
    loveuqian  
       2015-07-28 23:15:18 +08:00
    这是 C++ 语法嘛。。。表示第八行看不懂了。。。
    spencerqiu
        4
    spencerqiu  
    OP
       2015-07-28 23:15:58 +08:00
    @hx1997
    另外不知大神一年之后出国/不出国有什么着落么= =之前看过你的帖子 ,记忆深刻
    hx1997
        5
    hx1997  
       2015-07-29 00:16:11 +08:00
    @spencerqiu 我知道了,void 型函数的 return 语句只是用来改变控制流的,让函数立即返回,然而这个函数里加不加 return 都一样,因为第一个 if 里为真的情况执行完之后函数就结束了,相当于马上返回。但有的程序可能在那整个 if 语句后边还有代码,但不希望被执行到,就直接 return 就好了。

    事实上,你不写 return 函数结束后也会「返回上一个状态」,这是编译器处理的,也许你可以去了解一下函数调用栈。

    // 非大神,决定晚点再出国,总有机会的。谢谢关心:-)
    msg7086
        6
    msg7086  
       2015-07-29 02:02:32 +08:00
    中途return本来就是大块if-else的语法糖(虽然底层其实是反过来
    magicyu1986
        7
    magicyu1986  
       2015-07-29 02:14:44 +08:00
    递归出口在第一个 IF 哪里, 用不用return都一样.
    bazingaterry
        8
    bazingaterry  
       2015-07-29 02:20:11 +08:00
    你可以理解成void函数最后会自动return嘛……

    ----

    Stack Overflow即视感~
    :) 没恶意
    Valyrian
        9
    Valyrian  
       2015-07-29 09:20:49 +08:00
    因为
    ```
    void f() {
    if { ... }
    else {...}
    return; (可省略)
    }
    ```

    ```
    void f() {
    if { ... return; }
    else {...}
    }
    ```
    是一样的
    zhicheng
        10
    zhicheng  
       2015-07-29 09:37:02 +08:00 via Android
    如果 if 在 return 就不要用 else 和 else if 会造成理解困难,这是常识。
    canautumn
        11
    canautumn  
       2015-07-29 10:51:00 +08:00
    基本知识……这么写前面当然不用return,虽然:

    这种写法不是最佳实践。更好的代码风格是在递归结束的那个if处return,然后去掉else,减小原本在else从句中的大部分代码的缩进层级,理解更清晰。这个专门有个名词叫 Guard Clause 模式。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2828 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:40 · PVG 15:40 · LAX 23:40 · JFK 02:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.