有人可以向我解释一下这会发生什么吗?从我所拥有的一点点知识(显然我的想法是错的),对我而言,这应该继续将x减少1直到x为3.然后它应该转到'返回true,part并且当函数返回时是的,它返回到第二个if语句,返回false然后退出函数,因为如果函数返回false则无处可做。但这会继续回到第二个if语句,将x添加1,直到再次为9,然后退出。提前致谢。
bool Rec(int x)
{
if( x > 3)
{
if(Rec(x - 1) == true)
{
return false;
}
else
{
return false;
}
}
else
{
return true;
}
}
void main()
{
Rec(9);
}
答案 0 :(得分:0)
实际上,我没有发现代码运行方式存在问题。它确实有效。
它可以简化,相当于:
#include <stdio.h>
bool Rec(int x)
{
printf("x = %d\n", x);
if (x > 3)
{
Rec(x - 1);
return false;
}
return true;
}
int main(int argc, char* argv[])
{
Rec(9);
return 0;
}
产生:
x=9
x=8
x=7
x=6
x=5
x=4
x=3
但是你也说过:&#34;但是这会继续回到第二个if语句,将x加1,直到再次为9,然后退出&#34; 。但你实际上并没有在x中添加1。我认为发生的事情是你的调试。您还没有在代码中进行任何调试以打印出所述行为。
所以我会尝试为你做这件事。
bool Rec(int x)
{
printf("x = %d\n", x);
if (x > 3)
{
Rec(x - 1);
printf("*x = %d\n", x);
return false;
}
return true;
}
产生:
x = 9
x = 8
x = 7
x = 6
x = 5
x = 4
x = 3
*x = 4
*x = 5
*x = 6
*x = 7
*x = 8
*x = 9
仔细想想。您没有添加1.您的功能再次调用自己打印x =然后如果它大于3则执行相同操作。只有当x>它回来了吗?返回后它将再次打印* x = 所以它实际上是在递归调用之前打印x。我希望这可以帮助你了解正在发生的事情。
你的函数很好看看递归是如何工作的。但实际上你永远不会写那样的代码。因为你可以把它写成一个简单的循环。
如果您可以使用循环来提供代码,请避免递归。但有时候,递归更容易。例如,遍历二进制树非常简单。
这里有一些关于这个问题的答案,给出了递归有意义的真实世界的例子。 Real-world examples of recursion
答案 1 :(得分:-1)
这是递归的本质。你调用了6次函数,它将返回6次。