递归函数需有终止条件且每次调用须逼近终止,否则易栈溢出;深度超1000、局部变量过多、高频触发或缺少校验均会加剧风险。

递归函数就是函数自己调用自己。写对不难,但容易栈溢出——尤其处理大数据或深度嵌套时。关键不在“能不能递归”,而在“怎么控深度、减负担”。
没终止条件的递归会无限调用,直接爆栈。比如计算阶乘:
function factorial(n) { return n * factorial(n - 1); }
function factorial(n) {
if (n
return n * factorial(n - 1); // 向终止推进
}
JavaScript 引擎(如 V8)对调用栈深度有限制(通常几千层),超了就 RangeError: Maximum call stack size exceeded。应对策略不是“禁用递归”,而是优化执行方式:
function factorialTail(n, acc = 1) {
if (n
return factorialTail(n - 1, n * acc); // 尾调用:无后续运算
}
function flatten(arr) {
const result = [];
const stack = [...arr];
while (stack.length > 0) {
const item = stack.pop();
if (Array.isArray(item)) {
stack.push(...item);
} else {
result.push(item);
}
}
return result.reverse(); // 因为用 pop,顺序反了,可改用 unshift 或 shift+push
}
function traverse(node, depth = 0, maxDepth = 100) {
if (!node || depth > maxDepth) return;
console.log(node);
if (node.children) {
for (const child of node.children) {
traverse(child, depth + 1, maxDepth);
}
}
}
不是所有递归都危险,但这些组合要格外小心:
立即学习“Java免费学习笔记(深入)”;
遇到栈溢出,别只看报错行:
console.trace() 打印调用栈,看重复模式if (depth > 500) throw new Error('Too deep!');
以上就是javascript的递归函数怎么写_如何避免栈溢出问题的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号