-1

我正在做一个相当简单的跟踪练习,但是我不完全理解为什么解决方案是这样的......

void f( int n) {
  if (n>0) {
    f(n-1)
     cout << n << " ";
  }
}

int main () {
  f(5);
  return 0;
}

答案是 1 2 3 4 5,但是我想知道这是怎么回事,因为每次调用函数 f 时,它都不会到达 cout 行……我知道有一个堆栈系统,其中最后一个实现的函数是看着,然而,直到它返回一个值乘以前一个 n 的阶乘示例,我不明白这有什么相似之处。请不要再使用阶乘示例,我明白,但我不明白 cout 是如何在这里实现的。谢谢你的帮助。

4

2 回答 2

0

考虑调用的简单情况f(1)。我们通过了if测试并递归调用f(0). 此调用将返回什么都不做并继续执行f(1). 下一条语句是调用std::cout << 1 << " ";

// Substitute the parameter with the passed in argument n = 1
void f(1) {
  if (1 > 0) {
    f(0);
    std::cout << 1 << " ";
  }
}

您现在应该能够处理f(2), 和一般的情况f(n)。每当您陷入对递归程序的思考时,请考虑基本情况,然后进行概括。通过用实际参数替换函数参数来写出代码。

于 2013-09-25T04:06:40.183 回答
0

在递归调用返回之后,它确实到达了输出行。f

这里的重要部分是停止条件

if (n>0)

这使得递归调用仅在n大于零时发生。并且由于递归调用带有参数n - 1,它将越来越低,直到它为零并且不再进行调用。

让我们为您跟踪它,因为您懒得在调试器(或在纸上)自己做:

  1. 发出第一个呼叫mainn == 5并且明显大于零,因此使用递归调用5 - 1
  2. 在第二次调用中,n == 4, 仍然大于零,因此再次调用4 - 1
  3. 在第三次调用中,n == 3, 仍然大于零,因此再次调用3 - 1
  4. 在第四次调用中,n == 2, 仍然大于零,因此再次调用2 - 1
  5. 在第五次调用中,n == 1, 仍然大于零,因此再次调用1 - 1
  6. 在第六次调用中,n == 0大于零,因此不再进行调用并且函数返回。
  7. 返回到n == 1,因此1打印,然后函数返回
  8. 返回到n == 2,因此2打印,然后函数返回
  9. 返回到n == 3,因此3打印,然后函数返回
  10. 返回到n == 4,因此4打印,然后函数返回
  11. 返回到n == 5, so5被打印然后函数返回到main函数

也就是说,如果它编译的话,它应该是这样工作的。现在它甚至不会走这么远,因为你会有编译器错误(代码如你的问题所示)。

于 2013-09-25T04:01:47.130 回答