在 JavaScript 中,递归函数的空间复杂度主要取决于两个因素:递归调用栈的深度以及函数本身的参数。
以阶乘函数为例,其递归实现如下:
function factorial(n) {
if (n === 0) return 1;
return n * factorial(n - 1);
}
在这个例子中,递归调用栈的深度为 n
(因为每次调用都会将 n
减 1,直到 n
为 0 时停止调用)。同时,函数本身接收一个参数 n
。因此,该递归函数的空间复杂度为 O(n)。
需要注意的是,虽然递归实现可以直观地解决问题,但在某些情况下可能会导致栈溢出等问题。在实际编程中,可以考虑使用迭代实现来避免这些问题。例如,上述阶乘函数的迭代实现如下:
function factorial(n) {
let result = 1;
for (let i = 1; i <= n; i++) {
result *= i;
}
return result;
}
这个迭代实现的空间复杂度为 O(1),因为只需要常数级别的额外空间来保存变量 result
和循环计数器 i
。