0

我对以下算法有疑问,

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) 时出现堆栈溢出错误。这是为什么?堆栈内存中的行数(函数调用)不一样吗?

4

2 回答 2

1

我看到的最大区别是一个存储ints,另一个存储double在堆栈上。

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

于 2013-10-07T22:25:44.663 回答
1

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

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

于 2013-10-07T22:29:20.313 回答