gpt4 book ai didi

javascript - javascript/nodeJs 中的两个递归函数和计算器错误。了解差异

转载 作者:行者123 更新时间:2023-12-05 04:38:35 27 4
gpt4 key购买 nike

查看 SICP 书和 JS 函数式编程,我创建了两个递归函数。我的期望是他们都引发了堆栈溢出错误。但只有 sumAll() 函数引发了错误。请参阅下面函数 sumAll() 和 factorial() 的代码:

正如预期的那样,sumAll() 函数确实引发了堆栈溢出错误

function sumAll(n, i = 0, result = 0) {
return (i > n)
? result
: sumAll(n, i + 1, i + result);
}

console.log(sumAll(10000));

下面的 factorial() 函数没有引发堆栈溢出错误:

function factorial(n){
return (n == 1)
? 1
: n* factorial((n-1))
}

console.log(factorial(10000))

我的问题是为什么 factorial() 函数不会引发堆栈溢出并在 nodeJS 中完美运行,而 sumAll() 也在 nodeJS 中引发堆栈溢出

最佳答案

局部变量的数量(即局部变量的内存)也在调用堆栈大小中考虑。

function computeMaxCallStackFrames(a, b, c, d) {
try {
return 1 + computeMaxCallStackFrames(a + 1, b + 1, c + 2, d + 3);
} catch (e) {
// Call stack overflow
// console.log(e);
return 1;
}
}
var stackFrames = computeMaxCallStackFrames(1, 4, 6, 2);
console.log(stackFrames);

尝试增加编号。的参数,您会看到递归调用/调用堆栈帧数量的减少。

function computeMaxCallStackFrames(a, b, c, d, e) {
try {
return 1 + computeMaxCallStackFrames(a + 1, b + 1, c + 2, d + 3, e-2);
} catch (e) {
// Call stack overflow
// console.log(e);
return 1;
}
}
var stackFrames = computeMaxCallStackFrames(1, 4, 6, 2, 9);
console.log(stackFrames);

零局部变量。

function computeMaxCallStackFrames() {
try {
return 1 + computeMaxCallStackFrames();
} catch (e) {
// Call stack overflow
// console.log(e);
return 1;
}
}
var stackFrames = computeMaxCallStackFrames();
console.log(stackFrames);

因此,我们可以清楚地看到调用堆栈大小也考虑了局部变量的数量(即局部变量的内存)。如果有很多局部变量,那么没有。递归调用的次数会更少。

编辑:我们都知道堆栈大小会因浏览器而异。所以在不同的浏览器中输出不会相同,但在同一个浏览器中即使我们多次运行它应该是一致的。

希望现在一切都有意义。

关于javascript - javascript/nodeJs 中的两个递归函数和计算器错误。了解差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70567315/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com