【问题标题】:Why does this recursive function generate this output?为什么这个递归函数会产生这个输出?
【发布时间】:2011-12-22 21:10:50
【问题描述】:

我试图理解下面打印的程序的输出。当我查看它时,我看到当 printnum() 使用参数 1 调用时,将打印“1”,然后由于 1

#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) 是否被调用过;仅当x &lt; 7 成立时才使用x + 1 调用它,因此调用它的最大值是7。此外,我相信您编写的输出缺少3

标签: c


【解决方案1】:

printnum(8) 永远不会被调用,因为7 &lt; 7 不是真的。

到达x = 7 后,您会按降序打印数字的原因是,每次递归调用都会结束,让前一个调用继续。

考虑它对x = 1 的作用:

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

如果我们再扩展一层:

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

还有一个:

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

如果你继续这个扩展,你可以看到你在递归调用之前以升序获得数字,在递归调用之后以降序获得数字。

【讨论】:

  • 啊,抱歉,忘记更新我的文字了。我想你明白我的问题了吗?
  • @stanz77:我扩展了我的答案。 :)
【解决方案2】:

发生这种情况是因为第二个printf 在您的递归在每个级别退出后被调用。

当您的最后一次递归调用printfs 结束时,控制权转移到调用it 的函数——倒数第二次递归调用。然后,此调用退出 if 语句的范围,并调用 printf,然后结束 - 控制转换到调用 it 的函数 - 倒数第三个递归调用。重复直到你在调用printnum(1),它的返回将你带回main

【讨论】:

    【解决方案3】:

    这是递归。当你进入调用 printf 的函数时,你在递归中进入另一个层次,然后你输入 printnum,所以你用 x+1 调用 printf 等等。 当您到达停止条件 (x==7) 时,该函数会一直运行到第二个 printf(因此 7 将再次显示)。
    函数printnum终止,所以程序在上一层返回,那么第6层的printnum可以再次printf,终止并返回等等。

    【讨论】:

      【解决方案4】:

      在线评论!

      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
      $
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-29
        • 2013-03-10
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多