【问题标题】:stack running out of memory in recursion堆栈在递归中耗尽内存
【发布时间】:2013-10-08 06:29:20
【问题描述】:

我对以下算法有疑问,

public static int sum(int x){
    if (x == 0 || x==1)
    {
        return x;
    }
    else 
        return x + sum(x-1);

}

public static double factorial(int x)
{
    if (x==0 || x==1)
    {
        return 1;
    }
    else 
    {
        return (double)(x*factorial(x-1));
    }
}

我运行 sum (10,000) 和 factorial(10,000),运行 factorial(10,000) 但没有 sum(10,000) 时出现堆栈溢出错误。这是为什么?栈内存的行数(函数调用)不一样吗?

【问题讨论】:

  • 可能是因为 10,000!比宇宙中的原子数大几个数量级。
  • @musical_coder:没关系。
  • @musical_coder 没关系,这个数字会绕回来。

标签: recursion


【解决方案1】:

我看到的最大区别是,一个存储ints,另一个存储doubles。

double 使用更多空间(也就是说,通常......您没有用语言标记问题)。

【讨论】:

  • 事实上,当我们将factorial 的返回类型更改为int(假设是Java)时,差异就消失了。
  • 问题是,如果我将类型更改为 int,阶乘 (10,000) 的答案将为 0,因为它超出了 int 的范围
  • @user2277918 即使得到双倍的答案,你也将是错误的。 10000!大约等于 2.8 * 10^35659,这远远超出了 double 的范围。
  • 另外值得注意的是:factorial 返回一个双精度,但计算是在 整数 上完成的,这使得后期转换返回类型毫无价值。
  • @Jongware:不,计算完成int * double,隐式将int转换为double
【解决方案2】:

每个递归步骤所需的堆栈空间取决于临时对象的数量及其类型。参数和返回项也是如此。

正如上面每个人所指出的,两个函数的返回类型不同 - 这是更快的堆栈消耗的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 2014-01-02
    • 1970-01-01
    • 2020-02-10
    • 2011-07-25
    • 2023-03-08
    • 2019-02-11
    • 1970-01-01
    相关资源
    最近更新 更多