Laz*_*zer 5 language-agnostic memory recursion memory-management factorial
从Code Complete 2引用,
Run Code Online (Sandbox Code Playgroud)int Factorial( int number ) { if ( number == 1 ) { return 1; } else { return number * Factorial( number - 1 ); } }除了慢[1]并且使得 运行时内存不可预测[2]之外,这个例程的递归版本比迭代版本更难理解,后面是:
Run Code Online (Sandbox Code Playgroud)int Factorial( int number ) { int intermediateResult = 1; for ( int factor = 2; factor <= number; factor++ ) { intermediateResult = intermediateResult * factor; } return intermediateResult; }
我认为缓慢的部分是因为不必要的函数调用开销.
但递归如何使运行时内存的使用变得不可预测?
难道我们不能总是预测需要多少内存(因为我们知道递归应该何时结束)?我认为这与迭代案例一样不可预测,但现在不再如此.
由于递归方法会重复调用自身,因此需要大量堆栈内存。由于堆栈是有限的,如果超出堆栈内存就会发生错误。