javascript阶乘函数得到RangeError

时间:2018-07-18 14:29:25

标签: javascript node.js v8

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,我确实认为这是一个更好的解决方案,因为我认为它更快,更节省堆栈。 在我所知道的这两个函数中是否有不同之处。 请帮助我,谢谢。

1 个答案:

答案 0 :(得分:3)

因为Node.js不支持尾部调用优化,所以这两个函数都会在某个时候抛出RangeError: Maximum call stack size exceeded错误。何时发生取决于两个数量:堆栈的最大允许大小和每个单独堆栈帧的大小。默认情况下,堆栈的大小设置为某个恒定值,您可以通过运行以下命令来获得该值:

node --v8-options | grep -e '--stack-size' -A 1

因此,剩下的唯一参数是堆栈帧的大小。 factorial在每次函数调用时在堆栈上存储两个变量-accn。而factorial_normal仅存储一个-n。这意味着factorial将比factorial_normal快用完堆栈空间。