为什么必须在递归函数中使用else来获得整个排列

时间:2015-03-31 08:36:16

标签: c recursion

如果不使用其他,答案将只有一个。就像11111 ... 111,当使用其他时,我可以得到正确的答案。 代码:

void f(int cur, int n)
    {
        if(cur == n)// print answer
        {
            for(int i = 0; i < n; i++)
            printf("%d", A[i]);
            printf("\n");

        }
        //else  no else no whole answer
        for(int i = 1; i <= n; i++)
        {
            A[cur] = i;
            f(cur + 1, n);
        }
    }

3 个答案:

答案 0 :(得分:0)

如果你没有添加else,那么当cur == n时,你的函数也会执行这个for语句:

   for(int i = 1; i <= n; i++)
        {
            A[cur] = i;
            f(cur + 1, n);
        }

但是当你这样做时,每次你的情况都是真的,你只会执行

if(cur == n)// print answer
        {
            for(int i = 0; i < n; i++)
            printf("%d", A[i]);
            printf("\n");

        }

而不是两者。

答案 1 :(得分:0)

没有else,代码永远不会停止。

每次调用函数f()都会检查if (cur == n),如果这是真的则打印出来,然后,无论上述情况如何,都会进入for循环。在第一次迭代时,它使用下一个值cur调用自身,一切都会永远重复。

嗯,不是真的永远。因为每次调用它都会在A数组中写入而没有任何边界检查,迟早它会尝试写入一个不可写入的地址,SO将启动并强制终止该程序。

答案 2 :(得分:0)

好的,让我们想象一下cur == n。 (cur = 3和n = 3)

然后f()将打印输出,但它也会与其余代码连续。

因此,如果调用f(3, 3),则在打印A[]数组后,它将继续第二个for循环调用f((3 + 1), 3),这将再次调用f((4 + 1), 3),因此永远(或者你的程序由于超出内存而崩溃)。

结论:你的功能应该暂时停止并返回终止,但它没有。