Javascript factorial函数堆栈溢出

时间:2014-01-03 13:47:50

标签: javascript

为什么以下javascript factorial函数在调用时会抛出堆栈溢出错误?

function fact(n) {
    return function () {
        var n = n;
        return (n < 2) ? 1 : (n*fact(n - 1));
    }();
};

当我删除行var n = n;时,它按预期工作。另外,我知道内部函数是冗余的,只是在那里触发错误。

5 个答案:

答案 0 :(得分:8)

var n = n 在那种情况下有效地执行n = undefined,因为形式参数n和声明的n来自不同的范围。在您的评论声明中n和形式参数n在相同的范围内,因此情况并不相同。

undefined < 2始终为false,因此它会一直调用fact

答案 1 :(得分:1)

var n = n&lt; - 这里有两个问题。

1:您有两个具有相同名称的变量,它们如何区分

2:var n = n等于var n = undefined,导致false return并永远循环

您想要做的是:

function fact(n1) {
    return function (n1) {
        var n = n1;
        return (n < 2) ? 1 : (n*fact(n - 1));
    }();
};

答案 2 :(得分:0)

@ Esailija已经解释了原因。尝试:

function fact(n) {
  return function(n) {return n && n > 1 && n*(fact(n-1)) || 1;}(n);
  //                                                            ^ pass n here
};

或者使用闭包:

function fact(n) {
  return function() {return n && n > 1 && n*(fact(n-1)) || 1;}();
};

或者确实只是使用:

function fact(n) {
  return n && n > 1 && n*(fact(n-1)) || 1;
};

答案 3 :(得分:0)

return 0;行不是必需的,因为它定义了一个名为main的' new '变量,并将其设置为var n = n;

您的函数正在从匿名函数返回结果,而不必要

参数n在主函数中,不是在匿名函数中。

我还在n

中用n符号隔开
  • 原始代码:

    *
  • 更新的代码:

    (n*fact(n - 1))

答案 4 :(得分:0)

您只需要省略var n的重新声明,代码就可以正常工作。但是我会在这个循环中进行for循环,它花费了一半的时间。

function fact(n) {
    return function () {
        return (n < 2) ? 1 : (n*fact(n - 1));
    }();
};
let startDate = performance.now();
console.log(fact(170),`fact(170) took: ${(performance.now()-startDate)} milliseconds`);

function fact2(n) {
  let result = 1;
  for(let i = 2; i <=n; i++) {
    result *= i;
  }
  return result;
}
startDate = performance.now();
console.log(fact2(170),`fact2(170) took: ${(performance.now()-startDate)} milliseconds`);

PS:时机是出于好奇。我想了解在涉及Julia编程语言的 亲戚answer上,此答案所需的时间有所不同。