Java 理解链表的递归函数

Java 理解链表的递归函数,java,algorithm,search,recursion,data-structures,Java,Algorithm,Search,Recursion,Data Structures,我正在研究SequentialSearchST的代码,该代码由包含键值对的unordered链表实现。我被下面的delete方法卡住了,它试图找到并删除包含给定密钥的节点 public void delete(Key k) { first = delete(first, k); // first refers to the first node in the list } public Node delete(Node x, Key k) { if (x == null) return

我正在研究
SequentialSearchST
的代码,该代码由包含键值对的unordered链表实现。我被下面的delete方法卡住了,它试图找到并删除包含给定密钥的节点

public void delete(Key k) {
  first = delete(first, k); // first refers to the first node in the list
}

public Node delete(Node x, Key k) {
  if (x == null) return null;
  if (k.equals(x.key)) { return x.next; }
  x.next = delete(x.next, k);
  return x;
}
如何开发和理解这个递归函数,也就是说递归和归纳是一回事,我能从这个概念中得到帮助吗?如果是,那怎么办


谢谢,

这个递归实现可以重写为循环。不幸的是,所提供的实现中解决方案的细微差别不能完全表示为循环

首先了解每个方法的作用会有所帮助。第一个方法是outer方法——它处理列表为空的情况。第二种方法是内部方法,是实际递归的方法。内部方法的作用是找到与给定键匹配的元素,并返回列表中的下一个元素

如果我们有一个包含
[1,4,3,7,5]
的列表,并且想要删除元素
3
,我们需要做的就是将元素
4
上的下一个字段设置为元素
7
(元素
3
后面的元素)

带注释的调用/指令堆栈(假设第8行是
x.next=delete(x.next,k)
)如下所示:

delete(Key<3> k)
  delete(Node<1> x, Key<3> k)
    if (x == null) // x is not null
    if (k.equals(x.key)) // x.key is not k
    delete(Node<4> x, Key<3> k)
      if (x == null) // x is not null
      if (k.equals(x.key)) // x.key is not k
      delete(Node<3> x, Key<3> k)
        if (x == null) // x is not null
        if (k.equals(x.key)) // x.key is k!
          return x.next // Node<7>
      x.next = result // Node<4>.next = Node<7> (was Node<3>)
      return x // Node<4>
    x.next = result // Node<1>.next = Node<4> (no change)
    return x // Node<1>
  first = result // first = Node<1> (no change)

没有任何变化,因为从未找到给定的密钥。

您的问题非常模糊,我不确定您想问什么。你对这个特殊的例子,或者递归和归纳法感到困惑吗?“我怎样才能发展……这个能力”对于一个如此宽泛的问题来说太宽泛了。你对你的代码有什么特别的问题吗?如果你想理解递归,请查看这篇文章,它解释了使用递归的阶乘,我同意我的错误太模糊了,也许帮助我理解这个例子可以帮助我更好地理解递归?另外,我对阶乘递归非常熟悉,但唯一的问题是它们太简单了,上面的例子非常复杂。WDYT?不应
x.next=删除(x,k)
be
x.next=delete(x.next,k),否则您将在同一元素上无限递归。
delete(Key<2> k)
  delete(Node<1> x, Key<2> k)
    if (x == null) // x is not null
    if (k.equals(x.key)) // x.key is not k
    delete(Node<4> x, Key<2> k)
      if (x == null) // x is not null
      if (k.equals(x.key)) // x.key is not k
      delete(Node<3> x, Key<2> k)
        if (x == null) // x is not null
        if (k.equals(x.key)) // x.key is not k
        delete(Node<7> x, Key<2> k)
          if (x == null) // x is not null
          if (k.equals(x.key)) // x.key is not k
          delete(Node<5> x, Key<2> k)
            if (x == null) // x is not null
            if (k.equals(x.key)) // x.key is not k
            delete(null x, Key<2> k)
              if (x == null) // x is null!
                return null
            x.next = result // Node<5>.next = null (no change)
            return x // Node<5>
          x.next = result // Node<7>.next = null (no change)
          return x // Node<7>
        x.next = result // Node<3>.next = null (no change)
        return x // Node<3>
      x.next = result // Node<4>.next = null (no change)
      return x // Node<4>
    x.next = result // Node<1>.next = null (no change)
    return x // Node<1>
  first = result // first = Node<1> (no change)