在为即将到来的期末考试做研究时,我遇到了这个评论问题,我在致电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 << " ";
}
答案 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>0
是true
和4-2 == 2
所以我们可以简化为:
test_b(2);
cout << 4 << " ";
然后我们再次替换:
if (2>0)
test_b(2-2);
cout << 2 << " ";
cout << 4 << " ";
您可以重复简化和替换步骤,直到找到最终解决方案。