如果不使用其他,答案将只有一个。就像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);
}
}
答案 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)
,因此永远(或者你的程序由于超出内存而崩溃)。
结论:你的功能应该暂时停止并返回终止,但它没有。