我认为帖子的标题解决了我的问题。但重申一下,我想知道是否有人有更好的方法来解决这个问题。
/* Write a recursive program to compute lg( N! ) */
#include <iostream>
#include <cmath>
using namespace std;
long double log_base2( long double N ) {
return log( N )/log( 2.0 );
}
long double lg_n_factorial( long N ) {
if( 1 == N ) return log_base2( static_cast<long double>( N ) );
else return lg_n_factorial( N -1 ) + log_base2( static_cast<long double>( N ) );
}
int main( int argc, char *argv[] ) {
cout << ( lg_n_factorial( 10 ) ) << endl;
return 0;
}
根据人们的 react ,我应该澄清,这是书上的问题,书上说要递归地做。我正在练习编程问题,并尝试从其他人那里获得反馈,这样我就可以在努力成为一名更好的程序员的过程中发现自己的错误。
最佳答案
为什么要使用递归?迭代解决方案也同样有效:
long double lg_n_factorial( long N ) {
long double result = 0;
while (N > 1) {
result += log_base2(static_cast<long double>(N));
N--;
}
return result;
}
这样,您可以处理的最大值仅受 LONG_MAX
值的限制,而不是受堆栈溢出之前适合的递归调用数量的限制。
关于c++ - 计算lg(N!) : Anyone have a Better Recursive Method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6977939/