无法理解for循环中的递归

时间:2014-07-25 15:19:12

标签: c loops for-loop recursion

我无法理解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以及所有这些书。但没有我在循环中发现递归。 请帮助我,我的理解是错误的......?

3 个答案:

答案 0 :(得分:0)

所有xi 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]),而未初始化的新ii[10:01])。

在循环中,您将0分配给i[10:01]i[10:00]仍有0)并致电dec()。将创建另一个xi

依旧等等。

答案 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

请注意,打印的数字是04,因为仅当x == 0执行dec() return时才会显示。这种递归形式的打印顺序是LIFO(后进先出)。