java中while循环到递归的转换
嗨,我正在尝试将这个java while循环代码转换为递归。我曾尝试将其转换为递归,但不断出现错误。当我将while循环转换为递归时,当我遇到错误时,while循环工作正常。任何关于如何将其转换为递归的帮助都将不胜感激,谢谢java中while循环到递归的转换,java,recursion,data-structures,Java,Recursion,Data Structures,嗨,我正在尝试将这个java while循环代码转换为递归。我曾尝试将其转换为递归,但不断出现错误。当我将while循环转换为递归时,当我遇到错误时,while循环工作正常。任何关于如何将其转换为递归的帮助都将不胜感激,谢谢 public static boolean hasCycle( Node head) { Node slow = head; Node fast = head; boolean loop = false; while (slow != n
public static boolean hasCycle( Node head) {
Node slow = head;
Node fast = head;
boolean loop = false;
while (slow != null && fast != null && fast.getNext() != null) {
slow = slow.getNext();
fast = fast.getNext().getNext();
if(slow == fast) {
loop = true;
break;
}
}
return loop;
}
//递归码
Node slow = head;
Node fast = head;
boolean loop = false;
if(slow == fast) {
return true;
}else if(slow != fast) {
if(slow.getNext() != null) {
return hasCycle(slow.getNext());
}
return false;
}else {
if(fast.getNext() != null) {
return hasCycle(fast.getNext());
}
return false;
}
您似乎只在第一个迭代版本中检查即时循环。(您没有检查是否有更大的循环a->B->C->a。您只检查循环a->B->a)。我认为你所呈现的是正确的,你想要的,尽管有些奇怪。(如果你有一个更大的循环,它将无限继续) 执行递归演示的正确且更简单的方法是:
public boolean hasImmediateCycle(Node node) {
if (node == null || node.getNext() == null) {
return false;
} else if (node == node.getNext().getNext()) {
return true;
} else {
return hasImmediateCycle(node.getNext());
}
}
如果您想让它检查所有可能的循环,您需要稍微不同:
private boolean hasCycle(Node node, Set<Node> seen) {
if (node == null) {
return false;
} else if (seen.contains(node)) {
return true;
} else {
seen.add(node);
return hasCycle(node.getNext(), seen);
}
}
public boolean hasCycle(Node node) {
return hasCycle(node, new HashSet<Node>());
}
private boolean hasCycle(节点节点,已查看集){
if(node==null){
返回false;
}else if(seen.contains(节点)){
返回true;
}否则{
seen.add(节点);
返回hasCycle(node.getNext(),请参见);
}
}
公共布尔hasCycle(节点){
返回hasCycle(node,newhashset());
}
这将检查所有看到的
节点,以防它们再次出现在下一个参考中。这实际上使用了.equals()
和.hashCode()节点的
,节点的
,因此它们的实现一致性很重要。您得到的错误是什么?在我调用递归函数的那一行一直在说一个错误,您必须告诉我们错误是什么,以便我们理解问题是什么。此外,这将始终是真的:`if(slow==fast)`因为在上面的行中,您同时设置了slow=head
和fast=head
“但是我得到一个错误”是没有帮助的。告诉我们错误在哪里(在那一行加上注释),并复制错误的确切文本。否则就帮不了你了。