javascript - 递归算法的空间复杂度是否一定至少与递归调用的深度一样大?

标签 javascript algorithm recursion linked-list

当空间成为问题时,我无法确定递归函数何时与其迭代函数相比不是最优的。写递归函数的时候,如果不是尾递归,空间复杂度是否一定至少和递归调用的深度一样大?

例如,让我们使用递归从链表中删除重复项。这可以通过 O(n^2) 时间和 O(1) 空间的迭代方法轻松完成。但是递归变体也是 O(1) 空间吗?

removeDuplicatesRecursive() {
    let current = this.head;

    while (current.next) {
      if (this.head.data === current.next.data) {
        current.next = current.next.next
      } else {
        current = current.next;
      }
    }

    if (this.head.next) {
      removeDuplicatesRecursive(this.head.next);
    }

    return head;
  }

最佳答案

在上面的程序中,空间复杂度是O(n)

对于递归,在到达基本条件之前,对递归函数的每次调用,包括所有参数,局部变量都被放入调用堆栈。

对于上面的程序,当链表的所有元素都唯一时,函数调用次数最多。在这种情况下,将进行 n 次函数调用,空间复杂度将为 O(n)

关于javascript - 递归算法的空间复杂度是否一定至少与递归调用的深度一样大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51576067/

相关文章:

javascript - 为什么我可以将函数传递给提升的 R.divide?

java - 递归地在空格中添加星号

python - 如何计算递归函数的时间?

javascript - 使用客户端 REST api 的 Laravel 中不显示 PayPal 按钮

javascript - Ajax 是客户端脚本还是服务器端脚本?

javascript - 在非悬停元素上模糊

algorithm - 对点进行排序,使连续点之间的最小欧氏距离最大化

c# - 优化具有多个条件的嵌套 where 子句的最佳方法是什么?

c++ - 使用 Dijkstra 算法在网格上进行寻路

c++ - 函数结束后子节点的树递归c++缺失值