递归如何使运行时内存的使用变得不可预测?

Laz*_*zer 5 language-agnostic memory recursion memory-management factorial

Code Complete 2引用,

int Factorial( int number ) {
   if ( number == 1 ) {
      return 1;
   }
   else {
      return number * Factorial( number - 1 );
   }
}
Run Code Online (Sandbox Code Playgroud)

除了[1]并且使得 运行时内存不可预测[2]之外,这个例程的递归版本比迭代版本更难理解,后面是:

int Factorial( int number ) {
   int intermediateResult = 1;
   for ( int factor = 2; factor <= number; factor++ ) {
      intermediateResult = intermediateResult * factor;
   }
   return intermediateResult;
}
Run Code Online (Sandbox Code Playgroud)

我认为缓慢的部分是因为不必要的函数调用开销.

但递归如何使运行时内存的使用变得不可预测?

难道我们不能总是预测需要多少内存(因为我们知道递归应该何时结束)?我认为这与迭代案例一样不可预测,但现在不再如此.

cod*_*nix 3

由于递归方法会重复调用自身,因此需要大量堆栈内存。由于堆栈是有限的,如果超出堆栈内存就会发生错误。

  • 我认为这只是意味着“取决于运行时的值”。我可以预测的迭代版本总是占用 8 个字节的堆栈(或任何需要的字节),而我无法“预测”递归版本,因为它取决于运行时传入的“number”值。所以“不可预测”意味着“无法在编译时预测常量值”。 (3认同)