void abc(int n) {
if (n <= 10) {
abc(++n);
printf("%d\n", n);
}
}
void main() {
int m = 5;
abc(m);
}
输出显示:
11
10
9
8
7
6
我无法理解输出。请解释。我是一个新手代码爱好者。
答案 0 :(得分:2)
事件的顺序如下:
main
来电abc(5)
。abc(5)
:n
为<= 10
,因此n
会增加到6
,并调用abc(6)
。abc(6)
:n
为<= 10
,因此n
会增加到7
,并调用abc(7)
。abc(7)
:n
为<= 10
,因此n
会增加到8
,并调用abc(8)
。abc(8)
:n
为<= 10
,因此n
会增加到9
,并调用abc(9)
。abc(9)
:n
为<= 10
,因此n
会增加到10
,并调用abc(10)
。abc(10)
:n
为<= 10
,因此n
会增加到11
,并调用abc(11)
。abc(11)
:n
不是<= 10
,函数返回时没有任何输出。abc(10)
:其自己的n
变量仍为11
,printf
打印11
,函数返回。abc(9)
:其自己的n
变量仍为10
,printf
打印10
,函数返回。abc(8)
:其自己的n
变量仍为9
,printf
打印9
,函数返回。abc(7)
:其自己的n
变量仍为8
,printf
打印8
,函数返回。abc(6)
:其自己的n
变量仍为7
,printf
打印7
,函数返回。abc(5)
:其自己的n
变量仍为6
,printf
打印6
,函数返回。main
返回完成输出:
11
10
9
8
7
6
abc()
的每个实例都有自己的局部变量n
值,这解释了为什么不同实例打印的值不同。
请注意,您还应该:
<stdio.h>
main
:int main(void)
return 0;
末尾添加main
语句。答案 1 :(得分:0)
void abc(int n)
{
if (n<=10)
{
abc(++n);
printf("%d\n",n);
}
}
void main()
{
int m=5;
abc(m);
}
调用main
时,变量m
初始化为5
。
abc
并将5
传递给它。
首次执行abc
时,n = 5
。如果n
小于或大于10,则再次调用abc
,但这次使用1+n
。因此,由于5
小于10,因此调用abc
并将6
传递给它。
答案 2 :(得分:0)
要使函数清除,请按以下方式排除它自身的递归代码
void abc(int n)
{
if (n<=10){
++n;
printf("%d\n",n);
}
}
因此,如果使用参数等于5调用函数,则函数输出6.如果使用参数等于10调用函数,则函数输出11由于表达式语句
++n;
现在只需按以下方式添加递归调用
void abc(int n)
{
if (n<=10)
++n;
{abc( n);
printf("%d\n",n);
}
}
您将获得所描述的结果。
考虑到根据C标准,函数main应声明为
int main( void )
答案 3 :(得分:0)
我首先建议你阅读递归的基础知识。这对你有好处。
现在关于所有的递归调用,它将如下所示:
ABC(5);
这将使用值5调用函数abc。 现在在打印它之前,它将对abc进行递归调用,但在调用它之前会将n的值从5增加到6.在下一次调用中将发生同样的事情,从6到7,7到8,8到9,9现在,在n = 11的调用中,if条件将失败并且递归将停止。从递归调用返回时,它将打印增量值,但从最后一次调用到第一次调用,即。为11比10,依此类推至6月。
答案 4 :(得分:0)
首先在这些代码行中,输出是什么?
printf("7\n");
printf("6\n");
如果你在7
之前猜测6
你是对的。如果你调用两个打印东西的函数,那么先调用的函数将首先输出。这非常重要
让我们首先重写你的函数,这样每一行都不会做单独的事情。我正在考虑改变++n
:
void abc(int n) {
if (n <= 10) {
n = n + 1;
abc(n);
printf("%d\n", n);
}
}
因此,如果您将9
传递给此,则会先将n
更改为10
,然后致电abc(10)
并获取的输出它打印10
。对abc(10)
的调用会将其n
增加到11
并首先调用abc(11)
,这不会执行任何操作,然后执行printf
"11\n"
并返回n
为10
的呼叫,并在返回初始呼叫之前执行printf
"10\n"
。
输出结果为:
11
10
如果你abc(5)
它的工作方式相同。 abc(6)
需要先输出。在abc(6)
abc(7)
需要首先输出到11
它没有输出然后它返回,打印11
,10
,. ...... n + 1
。
让我们说你从基础案例abc(11)
开始,看看代码没有做任何事情。
然后你看看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"
1}}然后它执行打印"6\n"
的下一行,输出abc(5)
"11\n10\n9\n8\n7\n6\n"