我无法理解recursion
中的for loop
。
我想了解一个程序string permutation
,
请看下面的代码
void swap (char *x, char *y)
{
char temp;
temp = *x;
*x = *y;
*y = temp;
}
void permute(char *a, int i, int n)
{
int j;
if (i == n)
printf("%s\n", a);
else
{
for (j = i; j <= n; j++)
{
swap((a+i), (a+j));
permute(a, i+1, n);
swap((a+i), (a+j)); //backtrack
}
}
}
int main()
{
char a[] = "ABC";
permute(a, 0, 2);
getchar();
return 0;
}
我在互联网上看过这段代码。这工作正常。 但对我来说,很难理解。
所以,我写了一个小的递归函数来理解上面的complex code
。
我的代码就像这样
void dec(int x)
{
int i;
if(x <= 0)//if(x==0)
{
return;
}
else{
for(i = 0;i <= 5; i++)
{
dec(--x);
printf("%d\n", x);
}
}
}
int main()
{
dec(5);
system("pause");
return 0;
}
我在这里看到的输出是-ve
。
我完全感到困惑的是递归是如何进行循环的。
截至目前我已了解,它必须运行dec(--x)
,直到达到基本条件if (x<=0)
。
然后它应该返回并打印x为5 4 3 2 1 0
而不是它进入-ve
。
在+ve
整数之间会有多少?我完全糊涂了......请帮助我。
Output
0
-1
-2
-3
-4
-5
1
0
-1
-2
-3
-4
2
0
-1
-2
-3
-4
-5
1
0
-1
-2
-3
3
0
-1
-2
-3
-4
-5
1
0
-1
-2
-3
-4
2
0
-1
-2
-3
-4
-5
1
0
-1
-2
4
0
-1
-2
-3
-4
-5
1
0
-1
-2
-3
-4
2
0
-1
-2
-3
-4
-5
1
0
-1
-2
-3
3
0
-1
-2
-3
-4
-5
1
0
-1
-2
-3
-4
2
0
-1
-2
-3
-4
-5
1
0
-1
Press any key to continue . . .
请帮我理解递归函数。
我读了书和Fibonacci series and factorial
以及所有这些书。但没有我在循环中发现递归。
请帮助我,我的理解是错误的......?
答案 0 :(得分:0)
所有x
和i
s彼此不同。
我们假设您使用的计算机速度非常慢并且运行程序。
在10:00,您在dec(5)
中运行main
指令。这会创建一个值为x
且值为i
的{{1}}。我们称他们为x[10:00]
和i[10:00]
。
然后您输入循环并将0
分配给i[10:00]
。并再次拨打dec()
,这次是值4(当x[10:00]
更改无关时;可能是在通话之前或之后)。第二次调用会创建一个新的x
,其值为4(x[10:01]
),而未初始化的新i
(i[10:01]
)。
在循环中,您将0
分配给i[10:01]
(i[10:00]
仍有0
)并致电dec()
。将创建另一个x
和i
。
依旧等等。
答案 1 :(得分:0)
你的递归函数有min(n!,5!)复杂度,因为它包含一个循环,并在此循环中调用自身。
例如,如果您使用x = 5输入它:
它是&gt; = 0,所以它不会停止。
有一个循环被称为5次,并且在每个步骤中它使用递减参数调用相同的函数。
这意味着:在第一个循环步骤中,它开始使用参数x = 4调用自身:
b)也将以x = 3
开始循环(5次)c)也将以x = 2
开始循环(5次)d)也将以x = 1
开始循环(5次)e)最后一个循环也会启动循环(5次)并开始调用自身,但由于所有参数都是&lt; = 0,它最终会终止
f)然后外部循环(以x = 2开头)转到x = 1(并最终终止)
g)然后外部循环(以x = 3开头)转到x = 2(并执行c之间的所有内容)和f)
h)然后外循环(以x = 4开始)进入x = 3(并完成b)和g之间的所有内容
i)最终你的函数将打印min(n!,5!)数字(因为内部循环限制为5)。
答案 2 :(得分:-2)
如果您移除for
中的dec()
循环:
void dec(int x)
{
if(x <= 0)
{
return;
}
else
{
dec(--x);
printf("%d\n", x);
}
}
您将获得以下输出:
0
1
2
3
4
请注意,打印的数字是0
到4
,因为仅当x == 0
执行dec()
return
时才会显示。这种递归形式的打印顺序是LIFO(后进先出)。