为什么以下javascript factorial函数在调用时会抛出堆栈溢出错误?
function fact(n) {
return function () {
var n = n;
return (n < 2) ? 1 : (n*fact(n - 1));
}();
};
当我删除行var n = n;
时,它按预期工作。另外,我知道内部函数是冗余的,只是在那里触发错误。
答案 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上,此答案所需的时间有所不同。