C ++递归期末考试复习

时间:2017-05-10 14:38:43

标签: c++ recursion data-structures recursive-datastructures

在为即将到来的期末考试做研究时,我遇到了这个评论问题,我在致电test_b(4)时知道的答案是:0 2 4。我的问题是,如果第一个2出现在4之前,它会在0之后打印test_b(n - 2)cout吗?

void test_b(int n)
{
   if (n>0)
      test_b(n-2);
   cout << n << " ";
}

6 个答案:

答案 0 :(得分:4)

考虑V形状的来电:

 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。

答案 1 :(得分:3)

简单地说,在(n > 0)false之前打印 nothing ,并且命中了递归块。

当堆栈展开时,你得到输出,从0开始有效地增加2。

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

因为只有当if语句为false时才会到达print语句,即n <= 0。之后,相对于递归调用,它会向后打印n的值。

如果代码的呈现方式如此可能会更清楚:

void test_b(int n)
{
   if (n > 0)
   {
       test_b(n - 2); // II: execution resumes from here for the rest n's
   }

   cout << n << " ";  // I: this line is reached first when n <= 0  
}

答案 4 :(得分:1)

递归函数的工作方式与所有其他函数完全相同 (我认为这是了解递归的最重要的事情。)

所以,让我们通过将函数专门化为几个函数来摆脱递归。

这些功能相当于你的&#34;先递归&#34;实现:

void testb_0()
{
    cout << 0 << " ";
}

void testb_2()
{
    testb_0();
    cout << 2 << " ";
}

void testb_4()
{
    testb_2();
    cout << 4 << " ";
}

这些相当于你的&#34;先打印&#34;实现:

void testa_0()
{
    cout << 0 << " ";
}

void testa_2()
{
    cout << 2 << " ";
    testa_0();
}

void testa_4()
{
    cout << 4 << " ";
    testa_2();
}

我确信你明白这些是如何不同的。

答案 5 :(得分:0)

想象一下如何运作的一种方法是进行一系列替换和简化 我们从test_b(4)开始。这可以替换为test_b的正文,但我们会将n替换为4

if (4>0)
   test_b(4-2);
cout << 4 << " ";

我们知道4>0true4-2 == 2所以我们可以简化为:

test_b(2);
cout << 4 << " ";

然后我们再次替换:

if (2>0)
   test_b(2-2);
cout << 2 << " ";
cout << 4 << " ";

您可以重复简化和替换步骤,直到找到最终解决方案。