当前位置: 首页 > 知识库问答 >
问题:

使用迭代和递归计算阶乘时的不同答案

惠翰藻
2023-03-14

第一次在这里张贴海报,我希望这个问题是可以接受的。

作为一个小测试,我编写了一个使用迭代和递归计算数字阶乘的应用程序。这似乎工作正常,除非尝试计算大于24的数字的阶乘。

例如,当计算24的阶乘时,两种方法都给出了6204480173323941的正确答案。

然而,当计算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;
}

谢谢您的考虑。

共有3个答案

彭鸿彩
2023-03-14

乘法的顺序不同,由于浮点舍入,给出不同的结果。

如果您将for循环更改为从1i(而不是从i1),您应该得到与递归版本相同的结果。

秦渝
2023-03-14

类型不是精确类型。它promise是正确值的近似值。

因此,这两种实现都不能保证精确。

就您的实现而言,有两个因素可能会导致不同的答案。

  1. 您对乘法的排序不同
  2. 迭代版本在同一个变量中执行所有数学运算。与英特尔兼容的体系结构(x86和x86-64)在其浮点寄存器中使用80位精度,并且在寄存器存储到内存中之前一直保持该精度
梅安平
2023-03-14

递归版本计算5*(4*(3*(2*1)))

迭代版本计算1*(2*(3*(4*5)))

运算顺序的不同会改变浮点算术的循环方式,从而产生不同的结果。

 类似资料:
  • 本文向大家介绍Java算法之递归算法计算阶乘,包括了Java算法之递归算法计算阶乘的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享的java算法计算阶乘,在学习Java课程时经常会遇到求阶乘问题,今天接跟大家一起探讨一下 代码如下: 运行结果:

  • 我应该如何改变阶乘递归,只计算阶乘的奇数或双元素?例如,如果: 结果应该返回1*3*5*7=105 我知道递归是如何工作的,我只需要一点帮助,我应该使用哪种方法。

  • 问题内容: 我正在使用《 Java:完整参考》这本书来学习Java。目前,我正在从事递归主题。 请注意: 关于stackoverflow也有类似的问题。我搜索了它们,但没有找到解决问题的方法。我对以下程序中的逻辑感到困惑。 如果我运行下面的程序,它将产生正确的输出,但是我不理解其逻辑。 我不理解以下行中的逻辑: result = fact(n-1)* n; 据我所知,如果我们按以下程序所示传递n

  • 我尝试编写一个递归方法,将从0到输入数字的所有阶乘值相加,并将结果作为双精度返回。我使用递归阶乘方法来计算各个阶乘。但我不明白如何使所有阶乘求和的方法成为递归方法,使用两个递归而不是一个递归和for循环。 这是密码!

  • 我在理解算法的时间复杂性方面有问题。 让我们举第一个例子,用这个算法在二叉搜索树中进行搜索: 那么,如何计算这个时间复杂度呢? null

  • 我如何使程序执行一个新的或重复的操作,或要求用户再次输入一个数字,并知道它的阶乘。