C 无法理解此代码的输出
我无法理解输出。请解释一下。我是一个新手代码爱好者。C 无法理解此代码的输出,c,recursion,C,Recursion,我无法理解输出。请解释一下。我是一个新手代码爱好者。void abc(int n) 11 10 9 8 7 6 { 如果(n要使函数清晰,请按以下方式排除函数本身的递归代码 void abc(int n) { if (n<=10) { abc(++n); printf("%d\n",n); } } void main() { int m=5; abc(m); } ++n; 现在只需按以下方式添加递归调用 void abc(int
void abc(int n)
11
10
9
8
7
6
{
如果(n要使函数清晰,请按以下方式排除函数本身的递归代码
void abc(int n)
{
if (n<=10)
{
abc(++n);
printf("%d\n",n);
}
}
void main()
{
int m=5;
abc(m);
}
++n;
现在只需按以下方式添加递归调用
void abc(int n)
{
if (n<=10)
{
abc(++n);
printf("%d\n",n);
}
}
void main()
{
int m=5;
abc(m);
}
++n;
我首先建议你阅读递归的基础知识,这对你有好处
关于所有递归调用,如下所示:
abc(5)
这将调用值为5的函数abc。
现在,在打印之前,它将对abc进行递归调用,但在调用之前,它将把n的值从5增加到6。同样的情况也将发生在下一次调用中,从6增加到7,从7增加到8,从8增加到9,从9增加到10,从10增加到11。现在,在调用n=11时,if条件将失败,递归将停止。从递归调用返回时,它将打印increment从最后一次调用到第一次调用,即从11次调用到10次调用,依此类推,直到6次调用。事件顺序如下:
main
调用abc(5)
abc(5)
:n
在这些代码行中,首先是,输出是什么
11
10
9
8
7
6
如果您在6
之前猜测7
,您是正确的。如果您调用两个打印内容的函数,则首先调用的函数将首先输出。这非常重要
让我们先重写您的函数,这样每一行就不会做单独的事情。我正在考虑修改++n
:
printf("7\n");
printf("6\n");
如果您执行abc(5)
操作,其工作原理相同。abc(6)
需要先输出。在abc(6)
abc(7)
中,需要先输出到11
没有输出,然后返回,打印11
,10
,…n+1
你可以反过来做!
假设您从基本情况开始,看到代码没有任何作用
然后你看一下abc(10)
。你会看到它首先将n
增加到11
,然后调用abc(11)
,我们之前看到它什么都不做,然后它打印n
,因此11
。因此abc(10)
打印“11\n”
如果您查看abc(9)
您会看到n
增加到10
,然后它调用abc(10)
。您已经知道它打印“11\n”
,然后它执行printf
,将“10\n”添加到输出中,因此:
11
10
现在,如果你用一个较低的数字来做这件事,你最终会得到abc(5)
。它将n
增加到6
,然后调用abc(6)
,你知道它会输出“11\n10\n9\n8\n7\n”
,然后它会输出下一行“6\n”
“11\n10\n9\n8\n7\n6\n”
通过将代码写在纸上和/或使用调试工具逐步完成代码的功能,因此void main()
不是标准的C-它应该是int main(void)
(请参阅:)@TanmoyMukherjee:您可以通过单击分数下面的灰色复选标记接受其中一个答案。“printf(%d\n”“
永远不会被调用”?什么?当然会被调用。你运行过这个代码吗?@unholyseep Woops.Updated。不,我没有运行这个代码。”这个过程一直重复到n@UnholySheep Happy now?另外,你能解释一下当n>10时会发生什么吗?@pookie——如果n>10,函数返回给调用者;因此当n
增加到11abc()
返回到上一个调用时,abc(10)
,并执行printf()
,打印11
,然后返回上一个调用,等等…非常感谢您的回答。我不清楚的一点是,为什么递增的值从最后一个打印到第一个…是因为中间值存储在堆栈上并从顶部弹出还是什么?运行函数abc(5)将类似于:if(nThanx)。我不明白为什么代码按递减顺序打印11然后10然后9…第一个示例中缺少大括号,第二个示例中的缩进和格式错误。@chqrlie谢谢。谢谢大家。现在已经很清楚了。您为新手学习编码提供了很多帮助。
printf("7\n");
printf("6\n");
void abc(int n) {
if (n <= 10) {
n = n + 1;
abc(n);
printf("%d\n", n);
}
}
11
10
11
10