我想了解下面打印的程序的输出。当我看到它时,我看到当使用参数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
答案 0 :(得分:5)
printnum(8)
永远不会被调用,因为7 < 7
并不是真的。
一旦达到x = 7
,你得到以降序打印的数字的原因是每个递归呼叫都结束,让前一个呼叫继续。
考虑它对x = 1
的作用:
x = 2
如果我们更多地扩展这一级别:
x = 3
还有一个:
x = 4
如果继续此扩展,您可以看到在递归调用之前按升序获取数字,在递归调用之后按降序获取数字。
答案 1 :(得分:4)
这是因为在递归退出每个级别后调用第二个printf
。
当您的最终递归调用printf
结束时,控制转换为调用 it 的函数 - 倒数第二次递归调用。然后,此调用退出if
语句的范围,并调用printf
,然后结束 - 在哪个控件转换为调用 it 的函数 - 第三个到 - 最后一次递归调用。重复此操作,直到您进入printnum(1)
的来电,其回复会将您带回main
。
答案 2 :(得分:1)
这是递归。当你输入你调用printf的函数,然后在递归中输入另一个级别,然后输入printnum,所以你用x + 1调用printf,依此类推。
当您到达停止条件(x == 7)时,该功能将一直运行到第二个printf(因此将再次显示7)。
函数printnum终止,所以程序返回上面的级别,然后第6级的printnum可以再次printf,终止并返回等等。
答案 3 :(得分:0)
在线评论!
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
$