初めての投稿ですが、この質問が受け入れられることを願っています。反復と再帰を使用して階乗を計算するときの回答が異なります
小さなテストとして、繰り返しと再帰の両方を使用して数値の階乗を計算するアプリケーションを作成しました。これは、例えば24
より大きい数値の階乗を計算しようとすると、24の階乗を計算するときに25の階乗を計算する場合、両方の方法は62044840173323941.
の正しい答えを与える以外正常に動作するように見えましたしかし、答えは異なります。再帰的方法では1.5511210043330986e + 025となり、反復法では1.5511210043330984e + 025となります。
Wolfram Alphaによると、正しい答えは反復法と同じでなければならないので、関数間の矛盾はなぜですか?私は同僚に尋ねましたが、彼らはまたその行動を説明することができません。
#define TEST_CASE 25
double GetFactorialRecursive(double i)
{
if (i == 1)
return i;
else
return i * GetFactorialRecursive(i - 1);
}
double GetFactorialIterative(double i)
{
double result = 1.0;
for (; i > 0; --i)
result *= i;
return result;
}
int main()
{
double recres = 0, itrres = 0;
recres = GetFactorialRecursive(TEST_CASE);
itrres = GetFactorialIterative(TEST_CASE);
if (recres != itrres)
std::cout << "Error" << "\n";
std::cout << std::setprecision(25) << "Recursion: " << recres << ", Iteration: " << itrres << "\n";
return 0;
}
ご検討いただき、ありがとうございます。
私はこれを自分で試しました。同様の結果、2つの数値が1つのビットだけ異なっていることも注目に値する: 'Recursion:15511210043330986055303168 [4529a940c33f6121]と' Iteration:15511210043330983907819520 [4529a940c33f6120] – benzado