-3

可能重复:
什么是真正的递归并解释这个程序的输出?
这段代码到底发生了什么?

我有一个我不明白的递归函数。我什至不知道代码是否有效:

int count(int x) // suppose x is 3
{
  if(x>0)
  {
    count(--x);
    printf(x);
    count(--x);  // control reaches here or not?
  }
}

这只是伪代码。取初始变量为3。请结合上下文解释堆栈的概念。这段代码让我困惑了好几天,我真的找不到这段代码的答案。

4

2 回答 2

2

好的,只是因为我需要唤醒我的大脑一点:-)

count(3)将进入函数并调用count(2)(第 2 级)。
count(2)将进入函数并调用count(1)(3:rd 级别)。
count(1)将进入函数并调用count(0)(第 4 级)。
count(0)将进入函数,但由于x>0为假,它不会做任何事情,只是返回到x仍然为 0 的第 4 层。

4:th level 将输出0, 并调用count(-1)(5:th level)

count(-1)将进入函数,但由于x>0是假的,它不会做任何事情,只是返回到x仍然是 -1 的第 4 层。
4:th level 返回到 3:rd levelx仍然是 1。

3:rd level 将输出1和调用count(0)(4:th level)

count(0)将进入函数,但由于x>0为假,它不会做任何事情,只是返回x仍为 0的
第 3 级。第 3 级返回x仍为 2 的第 2 级。

2:nd level 将输出2和调用count(1)(3:rd level)

count(1)将进入函数并调用count(0)(第 4 级)。
count(0)将进入函数,但由于x>0为假,它不会做任何事情,只是返回到x仍然为 0 的 3:rd 级别。

3:rd level 将输出0和调用count(-1)(4:th level)

count(-1) will enter the function, but since x>0 is false, it won't do anything and just return to 3:rd level where xis still -1.

3:rd level returns to 2:nd level where x is still 1.
2:nd level returns to 1:st level and we're done.

Output is 0 1 2 0.

I suggest that if you really want to understand this, try it yourself with count(4).

于 2012-09-06T19:08:06.230 回答
0

这个函数根本不会返回任何东西。在过去的几天里,我已经看到这个问题在这里发布了很多次。这是一些带有注释的工作代码,可帮助您理解:

/*function declaration so that the program can utilize it*/
int count(int x);

/*main routine that calls the function*/
int main(void)
{
    count(3);    //call the function
    return 0;
}      

/*function prototype*/
int count(int x)
{
    if(x > 0)
    {
         printf("%d", x - 1); //print the value of x - 1 to the screen 
         return count(--x);   //Have the function call itself again with a new argument (the value of x after being decremented)
    }
    return x;                 //x is no longer greater than 0 so return it's value
}

请注意return此示例中的使用,并阅读其return作用。现在这只是一些更正的代码。理解递归函数在做什么(在我看来)的最好方法是将它写在纸上。

于 2012-09-06T18:48:40.650 回答