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

时间:2011-12-22 12:48:42

标签: 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);
}

输出:

12345677654321

4 个答案:

答案 0 :(得分: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

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

答案 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
$