【问题标题】:Converting while loop to recursion in java在java中将while循环转换为递归
【发布时间】:2019-09-29 06:39:37
【问题描述】:

您好,我正在尝试将此 java while 循环代码转换为递归。我尝试将其转换为递归,但我不断收到错误消息。当我将它转换为递归时,while循环工作正常,当我遇到错误时。任何有关如何将其转换为递归的帮助将不胜感激,谢谢。

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;
    }

【问题讨论】:

  • 您遇到的错误是什么?
  • 在我调用递归函数的那一行一直说错误
  • 您必须告诉我们错误是什么,我们才能理解问题所在。
  • 另外,这永远是真的:` if(slow == fast) ` 因为在上面的行中你设置了slow = headfast = head
  • “但我得到一个错误”没有帮助。告诉我们错误在哪里(在该行添加注释),然后复制错误的确切文本。否则无法为您提供帮助。

标签: java recursion data-structures


【解决方案1】:

您似乎只在您的第一个迭代版本中检查即时循环。 (您不是在检查是否有更大的循环 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>());
}

这将检查所有seen 节点,以防它们再次出现在next 参考中。这实际上使用了Node 中的.equals().hashCode(),因此重要的是它们必须相互一致地实现。

【讨论】:

    猜你喜欢
    • 2020-09-05
    • 2019-05-11
    • 2013-07-20
    • 2020-06-20
    • 2018-03-15
    • 2017-10-26
    • 1970-01-01
    • 2012-08-04
    相关资源
    最近更新 更多