Javascript 递归算法的空间复杂度是否必须至少与递归调用的深度一样大?

Javascript 递归算法的空间复杂度是否必须至少与递归调用的深度一样大?,javascript,algorithm,recursion,linked-list,Javascript,Algorithm,Recursion,Linked List,当空间是一个问题时,我很难确定递归函数何时次优于迭代函数。在编写递归函数时,如果不是尾部递归,那么空间复杂度是否必须至少与递归调用的深度一样大 例如,让我们使用递归从链表中删除重复项。这可以通过O(n^2)时间和O(1)空间中的迭代方法来实现。但是递归变量也是O(1)空间吗 在上述程序中,空间复杂度为O(n) 对于递归,在达到基本条件之前,对递归函数的每次调用(包括所有参数、局部变量)都会放入调用堆栈中 对于上述程序,当链表的所有元素都是唯一的时,函数调用的次数最多。在这种情况下,将进行n函数调

当空间是一个问题时,我很难确定递归函数何时次优于迭代函数。在编写递归函数时,如果不是尾部递归,那么空间复杂度是否必须至少与递归调用的深度一样大

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


在上述程序中,空间复杂度为
O(n)

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


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

您的递归算法没有意义<代码> ReaveDeLeCaleSeaSurviv.[/Cult>是作为成员方法编写的,但静态调用它并传递未使用的参数。此外,还要考虑为什么存在堆栈溢出错误。如果递归是O(1)空间,为什么对可以递归的次数有限制?
当链表的所有元素都是唯一的时,会出现空间复杂度最差的情况。
如果正确实现上述方法,它将始终达到空间复杂度最差的情况,因为它总是递归整个链表。这并不取决于元素是否唯一。当存在一些重复元素时,这些元素将被删除,因此不会调用这些元素。在big-O透视图中,是的,总是
O(n)
,这更有意义;出于某种原因,我不认为删除的元素限制了调用的数量。@kaidulisam如果
n
是递归调用的数量,那么c*n中的
c
是什么?@MarcFletcher我基本上把
c
放在函数堆栈中表示每次调用所需的空间并不总是恒定的,因为在方法内部,可以进行一些静态/动态内存分配。但是,对于您的程序来说,严格来说是
O(n)
。我还是编辑了我的答案,以消除混淆。
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;
  }