使用迭代和递归计算阶乘时的不同答案
Different answers when calculating factorial using iteration and recursion
第一次在这里发帖,我希望这个问题是可以接受的。
作为一个小测试,我编写了一个应用程序,使用迭代和递归计算一个数字的阶乘。除了试图计算大于24的数的阶乘外,这似乎工作得很好。
例如,当计算24的阶乘时,两种方法都给出了正确的答案62044840173323941。
然而,当计算25的阶乘时,答案不同。递归法的结果为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;
}
谢谢您的考虑。
递归版本计算5 * (4 * (3 * (2 * 1)))
迭代版本计算1 * (2 * (3 * (4 * 5)))
操作顺序的不同会改变浮点运算的舍入方式,从而导致不同的结果。
类型double
不是精确类型。它保证是正确值的近似值。
所以不能保证两种实现都是精确的
考虑到你的实现,有两个因素可能导致不同的答案。
- 你的乘法顺序不一样。
- 你的迭代版本在同一个变量中执行所有的数学运算。intel兼容的架构(x86和x86-64)在其浮点寄存器中使用80位精度,并且该精度一直保持到寄存器被存储到内存中。
由于浮点四舍五入,乘法的顺序不同,得到的结果也不同。
如果您将for
循环从1
变为i
(而不是从i
变为1
),您应该得到与递归版本相同的结果。
相关文章:
- 在 C++ 中的数组上使用阶乘函数
- 阶乘问题在 c++ 中给出错误的输出
- 大数的阶乘给出错误的输出
- 什么模板用法在阶乘中更好
- 为什么我在C++阶乘函数中出现编译错误?
- 计算阶乘的 C++17 倍表达式中的错误
- 为什么 Lisp 中 1000 阶乘的计算如此之快(并显示正确的结果)?
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 平方模型为零,阶乘模型问题
- 阶乘元规划
- 阶乘-c++ 我想以不同的方式打印
- 阶乘函数只返回C++中输入的答案
- 阶乘使用循环递增给出垃圾值
- 大 n 表示阶乘
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- 计算最大数字的阶乘
- 这个阶乘程序内部发生了什么?
- 返回阶乘C++的递归函数
- 使用迭代和递归计算阶乘时的不同答案
- 阶乘在main中显示错误的答案.在函数中正确计算