【发布时间】: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() == true和m.find() == false:不是问题原因,只是更好 -
请注意,多次调用
m.find()会在每次调用时转到下一个匹配项。您可能希望将m.find()存储在变量中。 -
@mritunjay 甚至
else return m.find()