【发布时间】:2018-12-26 12:40:41
【问题描述】:
const factorial = function(n, acc = 1){
if (n < 2) {
return acc;
}
return factorial(n - 1, n * acc);
};
const factorial_normal = function(n){
if (n < 2) {
return 1;
}
return n * factorial_normal(n - 1)
};
console.log(factorial(8956)); // RangeError: Maximum call stack size exceeded
console.log(factorial_normal(8960)); // Infinity
这只是一个简单的 javascript 阶乘函数。 但是我在第一个函数中得到了 RangeError,我认为这是一个更好的解决方案,因为我认为它更快并且更节省堆栈。 我所知道的这两个功能有什么不同吗? 请帮助我,谢谢。
【问题讨论】:
-
ps。我使用节点 v10.0.0
-
'超出最大调用堆栈大小' 欢迎来到递归世界。您刚刚遇到了该站点的名称源自的错误。
-
啊,see this other question. 看起来曾经可用的尾调用已经从 Node 中删除了。
-
您可以不使用递归来执行此操作,而是使用简单的 for 循环,这取决于传入的数字,这很容易破坏堆栈。
-
@AdamH 是的,我认为你是对的。循环样式丑陋但有效。即使 factorial(1000000...) 也很顺利:)
标签: javascript node.js v8