我有一个我不明白的递归函数。我什至不知道代码是否有效:
int count(int x) // suppose x is 3
{
if(x>0)
{
count(--x);
printf(x);
count(--x); // control reaches here or not?
}
}
这只是伪代码。取初始变量为3。请结合上下文解释堆栈的概念。这段代码让我困惑了好几天,我真的找不到这段代码的答案。
我有一个我不明白的递归函数。我什至不知道代码是否有效:
int count(int x) // suppose x is 3
{
if(x>0)
{
count(--x);
printf(x);
count(--x); // control reaches here or not?
}
}
这只是伪代码。取初始变量为3。请结合上下文解释堆栈的概念。这段代码让我困惑了好几天,我真的找不到这段代码的答案。
好的,只是因为我需要唤醒我的大脑一点:-)
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 x
is 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).
这个函数根本不会返回任何东西。在过去的几天里,我已经看到这个问题在这里发布了很多次。这是一些带有注释的工作代码,可帮助您理解:
/*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
作用。现在这只是一些更正的代码。理解递归函数在做什么(在我看来)的最好方法是将它写在纸上。