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

2015-07-28 23:06:55 +08:00
 spencerqiu

虽然加了 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);
            }
        }
    }
}
884 次点击
所在节点    C
11 条回复
hx1997
2015-07-28 23:12:13 +08:00
void 为什么要 return?

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

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

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

----

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

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

这种写法不是最佳实践。更好的代码风格是在递归结束的那个if处return,然后去掉else,减小原本在else从句中的大部分代码的缩进层级,理解更清晰。这个专门有个名词叫 Guard Clause 模式。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/209057

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX