繁体   English   中英

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

[英]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

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

如果我们进一步扩展这一级别:

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

还有一个:

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

如果继续进行此扩展,则可以看到递归调用之前按升序排列的数字,递归调用之后按降序排列的序列。

发生这种情况是因为在每个级别的递归退出之后,第二个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM