程序调用自身称为递归,将输出作为输入再次处理称为迭代,
递归的优点 大问题转化为小问题,可以减少代码量,同时应为代码精简,可读性好, 缺点就是,递归调用浪费了空间,而且递归太深容易造成堆栈的溢出。
迭代的好处 就是代码运行效率好,因为时间只因循环次数增加而增加,而且没有额外的空间开销, 缺点就是代码不如递归简洁
补充
补充:递归与迭代的对比与使用建议:
维度 递归 迭代 实现 函数自调用 循环(for / while) 代码量 少、表达力强(树、图遍历) 多但直观 空间 调用栈开销,深递归易栈溢出 常数级额外空间 时间 函数调用开销大 通常更快 适用 树/分治 /回溯等"自相似"问题 线性、可直接推的问题 避免栈溢出的方法:尾递归(需引擎优化,JS 大部分引擎不保证)、改写成循环、使用 trampolining、或用堆栈手动模拟。
// 递归:阶乘
function factorial(n) { return n <= 1 ? 1 : n * factorial(n - 1) }
// 迭代:阶乘
function factorialIter(n) {
let r = 1
for (let i = 2; i <= n; i++) r *= i
return r
}
来源整理自:vue3js.cn 面试官系列



