![](/img/trans.png)
[英]why does a call of a function with set parameters does not generate the expected output?
[英]Why does this recursive function generate this output?
我正在尝试了解下面打印的程序的输出。 当我看它时,我看到当使用参数1调用printnum()时,将打印“ 1”,然后由于1 <7,所以函数将自行调用。 该过程将一直持续到打印“ 6”,然后调用printnum(7)为止。 因此,现在将打印“ 7”,并且不满足if条件,因此将跳过代码,然后移至第二个printf(“%d”,x)函数,再次打印“ 7”。 在第二个printf(“%d”,x)之后什么也没有,那么为什么一切都没有结束? 是什么让程序继续按降序再次打印数字?
#include <stdio.h>
int printnum ( int x )
{
printf("%d", x);
if ( x < 7 )
{
printnum ( x + 1 );
}
printf("%d",x);
}
int main()
{
printnum(1);
}
输出:
12345677654321
从不调用printnum(8)
,因为7 < 7
并不是真的。
达到x = 7
,您按降序打印数字的原因是,每个递归调用都将结束,而上一个调用将继续。
考虑x = 1
:
x = 2
递归调用 如果我们进一步扩展这一级别:
x = 3
递归调用 还有一个:
x = 4
递归调用 如果继续进行此扩展,则可以看到递归调用之前按升序排列的数字,递归调用之后按降序排列的序列。
发生这种情况是因为在每个级别的递归退出之后,第二个printf
被调用了。
在最后一次递归调用printf
结束时,控制权转移到调用它的函数-倒数第二个递归调用。 然后,此调用退出if
语句的范围,并调用printf
,然后结束(倒数第二到最后的递归调用)(在此之后,控件转换为调用它的函数)。 重复上述操作,直到您进入对printnum(1)
的调用之内,该调用将返回到main
。
这是递归。 当您输入函数时,调用printf,然后在递归中输入另一个级别,然后输入printnum,因此用x + 1调用printf,依此类推。 当您到达停止条件(x == 7)时,该功能将一直执行到第二个printf(因此将再次显示7)。
函数printnum终止,因此程序在上一级返回,然后在6级的printnum可以再次执行printf,终止和返回等等。
在线评论!
int printnum ( int x ) x = 1 x = 2 x=6 x=7
{
printf("%d", x); prints 1 prints 2 prints 6 prints 7
if ( x < 7 ) Yes Yes Yes No
printnum ( x + 1 ); calls printnum(2) calls printnum(3) .... calls printnum(7) N/A
printf("%d",x); print 2 and return to print 6 and return prints 7 and returns to the
the caller which is the previous caller to the previous previous caller which is
main() which is printnum(1) caller which is printnum(x=6)
printnum(5)
}
请检查以下内容以按升序和降序打印,并超过起始值和限制。.(请注意,未进行错误检查!)
#include <stdio.h>
int printnum_123(int x, int limit)
{
printf("%d ", x);
if (x<limit)
printnum_123(x+1, limit);
return;
}
int printnum_321(int x, int limit)
{
if (x<limit)
printnum_321(x+1, limit);
printf("%d ", x);
return;
}
int main(void)
{
printnum_123(1, 10); printf("\n");
printnum_321(1, 10); printf("\n");
return 0;
}
$ ./a.out
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
$
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.