javascript 阶乘函数出现 RangeError
javascript Factorial function got RangeError
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,我认为这是一个更好的解决方案,因为我认为它更快并且更节省堆栈。
我所知道的这两个功能有什么不同吗?
请帮助我,谢谢。
因为Node.js不支持尾调用优化,这两个函数都会在某些时候抛出RangeError: Maximum call stack size exceeded
错误。何时发生取决于两个量:堆栈的最大允许大小和每个单独堆栈帧的大小。默认情况下,堆栈的大小设置为某个常量值,您可以通过 运行 执行以下命令获得该值:
node --v8-options | grep -e '--stack-size' -A 1
所以,剩下的唯一参数就是堆栈帧的大小。 factorial
在每次函数调用时在堆栈上存储两个变量 - acc
和 n
。而 factorial_normal
仅存储一个 - n
。这意味着 factorial
将 运行 出栈 space 比 factorial_normal
更快。
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,我认为这是一个更好的解决方案,因为我认为它更快并且更节省堆栈。 我所知道的这两个功能有什么不同吗? 请帮助我,谢谢。
因为Node.js不支持尾调用优化,这两个函数都会在某些时候抛出RangeError: Maximum call stack size exceeded
错误。何时发生取决于两个量:堆栈的最大允许大小和每个单独堆栈帧的大小。默认情况下,堆栈的大小设置为某个常量值,您可以通过 运行 执行以下命令获得该值:
node --v8-options | grep -e '--stack-size' -A 1
所以,剩下的唯一参数就是堆栈帧的大小。 factorial
在每次函数调用时在堆栈上存储两个变量 - acc
和 n
。而 factorial_normal
仅存储一个 - n
。这意味着 factorial
将 运行 出栈 space 比 factorial_normal
更快。