我很难理解indexOf()
LinkedList
的{{1}}实现后的递归是如何工作的:
/**
* Returns the position of the first occurrence of the
* given character in this list, or -1 if there is no
* such occurrence.
*/
public int indexOf(char c)
{
if (this.head == null)
{
return -1;
}
else
{
return LinkedList.indexOf(c, this.head);
}
}
private static int indexOf(char c, Node node)
{
if (node.data == c)
{
return 0;
}
if (node.next == null)
{
return -1;
}
int index = LinkedList.indexOf(c, node.next);
if (index == -1)
{
return -1;
}
else
{
return 1 + index;
}
}
其中head
是列表中的初始节点(“link”)。
static indexOf()
方法检查头部是否存在数据匹配,然后检查是否存在下一个节点。假设两个条件都是false
(没有数据匹配,并且存在下一个节点)。然后在下一个(第二个)节点上递归调用indexOf()
以执行相同的检查。但是,如果两个条件仍然是false
,那么在int index
被声明之前没有else
子句的情况下它返回index
是什么?这似乎不合法。
当我在调试器中逐步执行它时,而不是返回任何内容它实际上似乎执行更多递归调用,直到满足if
条件之一(数据匹配或列表末尾) )。但为什么会这样呢?那么每次1
如何添加index
?
答案 0 :(得分:3)
但是,如果两个条件仍为false,那么在索引声明之前没有else子句会返回int索引是什么?
它还没有返回,它将进入另一个递归级别:
indexOf(node) -> indexOf(node.next) -> indexOf(node.next.next) -> ...
然后当条件满足时,它最终返回一个值,然后你开始从之前的每个递归调用回来:
indexOf(node) <- indexOf(node.next) <- indexOf(node.next.next) <- ...
但这样做它也会为它返回的索引加1,因此基本上计算你到达的递归级别,它等于你所达到的节点数,这是你要查找的索引。
此图显示了当第四个节点上存在匹配时算法如何工作。蓝色表示我们正在输入递归,红色表示我们从递归中返回(单击图像以原始大小打开它):
此另一个图表显示了在第三个节点上匹配时指令的执行顺序(单击图像以原始大小打开它):