【问题标题】:Java: Breaking the recursion when reaching a falseJava:达到错误时打破递归
【发布时间】:2017-04-09 18:14:52
【问题描述】:

我正在编写一个程序,它递归地在字符串中搜索字母 A、T、C 或 G。使用 Pattern 和 Matcher 将字符串的第一个字母与正则表达式进行比较。如果第一个字母匹配,则再次调用递归函数,但会删除已经匹配的第一个字母。

示例中的 ATTAFCG 之类的序列应立即返回 false 并在达到 F 时停止检查其余部分,但我发现它确实停在那里但返回仍然是 true 值。我的控制台输出是:

Value to return: true Where the letter is: A
Value to return: true Where the letter is: T
Value to return: true Where the letter is: T
Value to return: true Where the letter is: A
Status: true

即使在 m.find() 返回 false 时强制返回 false,最终返回值仍然是 true。我究竟做错了什么 ?是不是当到达一个错误的字母时,递归会返回并最终使用第一个字母的值(真)?下面是使用的代码:

public static void main(String[] args) {
    String sequence = "ATTAFCG";
    boolean found = recursive(sequence);
    System.out.println("Status: " + found);
}

public static boolean recursive(String input) {
    boolean returnValue = true;
    String pattern = "^[ATGC]*$";
    Pattern r = Pattern.compile(pattern);
    String[] list = input.split("");
    Matcher m = r.matcher(list[0]);

    if (input.length() > 1) {
        if (m.find() == true) {
            recursive(input.substring(1));
        } else if (m.find() == false) {
            returnValue = false;
            return returnValue;
        }
    } else if (m.find() == true) {
        returnValue = true;
    } else if (m.find() == false) {
        returnValue = false;
        return returnValue;
    }
    System.out.println("Value to return: " + returnValue + " Where the letter is: " + list[0]);
    return returnValue;
}

【问题讨论】:

  • 你想要return recursive(...)
  • 为什么需要使用递归正则表达式来做到这一点?为什么不只是return !Pattern.compile("[^ACTG]").matcher(input).find();
  • 注意:- 你应该使用 if(m.find())if(!m.find() 而不是 m.find() == truem.find() == false :不是问题原因,只是更好
  • 请注意,多次调用m.find() 会在每次调用时转到下一个匹配项。您可能希望将 m.find() 存储在变量中。
  • @mritunjay 甚至else return m.find()

标签: java recursion return


【解决方案1】:

试试看:

//...
    if (input.length() > 1) {
            if (m.find() == true) {
                returnValue = recursive(input.substring(1));
            } else if (m.find() == false) {
                returnValue = false;
                return returnValue;
            }
//...

问题在于,一旦您递归调用该方法,您就不会将 returnValue 设置为其结果(您应该这样做)

另外我宁愿翻转你代码中的逻辑,我认为将布尔值初始化为true是不好的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多