为什么这个递归函数会生成此输出?

bqu*_*i56 1 c

我想了解下面打印的程序的输出.当我看到它时,我看到当使用参数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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

12345677654321

Seb*_*olm 5

printnum(8)永远不会被称为,因为它不是真的7 < 7.

x = 7达到一次降序打印数字的原因是每个递归调用结束,使前一个调用继续.

考虑它的作用x = 1:

  • 打印1
  • 用递归方式调用 x = 2
  • 打印1

如果我们更多地扩展这一级别:

  • 打印1
    • 打印2
    • 用递归方式调用 x = 3
    • 打印2
  • 打印1

还有一个:

  • 打印1
    • 打印2
      • 打印3
      • 用递归方式调用 x = 4
      • 打印3
    • 打印2
  • 打印1

如果继续此扩展,您可以看到在递归调用之前按升序获取数字,在递归调用之后按降序获取数字.