首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++递归期末考试复习

C++递归期末考试复习
EN

Stack Overflow用户
提问于 2017-05-10 22:38:43
回答 6查看 261关注 0票数 2

当我准备即将到来的期末考试时,我遇到了这个复习问题,当我调用test_b(4)时,我知道答案是:0 2 4。我的问题是,如果第一个2cout之前,为什么它在cout之后打印24

代码语言:javascript
复制
void test_b(int n)
{
   if (n>0)
      test_b(n-2);
   cout << n << " ";
}
EN

回答 6

Stack Overflow用户

发布于 2017-05-10 22:47:06

考虑一下V形式的调用:

代码语言:javascript
复制
 test_b(4)
  | //>0, so enter the if
  |  test_b(2)
  |   | //>0 so enter the if
  |   |  test_b(0)
  |   |   | //==0, so skip if
  |   |   | print 0 // from the test_b(0)
  |   |   | return
  |   |  print 2 // from test_b(2)
  |   |  return
  |  print 4 // from test_b(4)
  |  return
// end

结果如图所示,先是0,然后是2,最后是4: 0 2 4。

票数 4
EN

Stack Overflow用户

发布于 2017-05-10 22:42:00

简而言之,在(n > 0)false之前不会打印任何内容,并且命中递归块。

当堆栈展开时,您将获得从0开始的输出,并且实际上是递增2。

逐行调试器在查看这样的内容时总是很有帮助的。

票数 3
EN

Stack Overflow用户

发布于 2017-05-10 22:46:37

test_b(4)的求值将生成三个嵌套调用。在第一个调用中,条件为真,因此它进行第二个调用;在第二个调用中,条件为真,因此它进行第三个调用。在第三个调用中,条件为false -在那个级别为n=0 -因此它直接跳到输出并输出它的值n,即0。然后,第三个调用返回到第二个调用-对于n=2 -并继续输出并打印2。然后第二个调用返回到第一个调用-对于n=4 -并继续到输出并打印4。然后第一个调用结束。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43895656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档