这个回文函数有什么问题
What is wrong with this Palindrome function
我在 Java 中使用递归编写了回文函数,但它打印的结果不正确。
public static boolean isPalindrome(String test) {
if(test.length() == 1 || test.equals("")) {
System.out.println("Length is one");
return true;
}
if (test.charAt(0) == test.charAt(test.length() - 1)) {
System.out.println("Length is one 111 a");
isPalindrome(test.substring(1,test.length() -1)) ;
}
System.out.println("Length is one 111");
return false;
}
public static void main(String args[]) {
if(isPalindrome("rotor"))
System.out.println(" Rotor is a palindrome");
else
System.out.println(" Rotor is not a palindrome");
//System.out.println(isPalindrome("rotor"));
//System.out.println(isPalindrome("motor"));
//System.out.println(isPalindrome("a"));
}
输出:
Length is one 111 a
Length is one 111 a
Length is one
Length is one 111
Length is one 111
Rotor is not a palindrome
您缺少 if
中的 return
语句。没有它,除了一个或零个字符的字符串外,最终将 return false
:
public static boolean isPalindrome(String test) {
if(test.length() <= 1) { // A more elegant check
return true;
}
if (test.charAt(0) == test.charAt(test.length() - 1)) {
// "return" was missing here
return isPalindrome(test.substring(1, test.length() -1)) ;
}
return false;
}
您的问题本质上源于糟糕的解决方案技术。递归是解决这个问题的次优方法——想想 JVM 必须创建的所有那些堆栈帧!如果您能够放弃这种方法,并且愿意为了简洁而牺牲性能,那么请使用
return test.equalsNoCase(new StringBuilder(test).reverse().toString());
这显然更容易维护(尽管这将创建两个额外的对象 和 执行两倍于绝对必要的字符比较)。如果您认为大小写对回文很重要,请使用 equals
。
您必须在此处添加return:
if (test.charAt(0) == test.charAt(test.length() - 1)) {
System.out.println("Length is one 111 a");
return isPalindrome(test.substring(1,test.length() -1)) ;
}
System.out.println("Length is one 111");
return false;
如果你不这样做,它会在你完成最后一次调用测试后继续执行(在你的例子中是字符串 "t"),它会以 return false 结束。
我在 Java 中使用递归编写了回文函数,但它打印的结果不正确。
public static boolean isPalindrome(String test) {
if(test.length() == 1 || test.equals("")) {
System.out.println("Length is one");
return true;
}
if (test.charAt(0) == test.charAt(test.length() - 1)) {
System.out.println("Length is one 111 a");
isPalindrome(test.substring(1,test.length() -1)) ;
}
System.out.println("Length is one 111");
return false;
}
public static void main(String args[]) {
if(isPalindrome("rotor"))
System.out.println(" Rotor is a palindrome");
else
System.out.println(" Rotor is not a palindrome");
//System.out.println(isPalindrome("rotor"));
//System.out.println(isPalindrome("motor"));
//System.out.println(isPalindrome("a"));
}
输出:
Length is one 111 a
Length is one 111 a
Length is one
Length is one 111
Length is one 111
Rotor is not a palindrome
您缺少 if
中的 return
语句。没有它,除了一个或零个字符的字符串外,最终将 return false
:
public static boolean isPalindrome(String test) {
if(test.length() <= 1) { // A more elegant check
return true;
}
if (test.charAt(0) == test.charAt(test.length() - 1)) {
// "return" was missing here
return isPalindrome(test.substring(1, test.length() -1)) ;
}
return false;
}
您的问题本质上源于糟糕的解决方案技术。递归是解决这个问题的次优方法——想想 JVM 必须创建的所有那些堆栈帧!如果您能够放弃这种方法,并且愿意为了简洁而牺牲性能,那么请使用
return test.equalsNoCase(new StringBuilder(test).reverse().toString());
这显然更容易维护(尽管这将创建两个额外的对象 和 执行两倍于绝对必要的字符比较)。如果您认为大小写对回文很重要,请使用 equals
。
您必须在此处添加return:
if (test.charAt(0) == test.charAt(test.length() - 1)) {
System.out.println("Length is one 111 a");
return isPalindrome(test.substring(1,test.length() -1)) ;
}
System.out.println("Length is one 111");
return false;
如果你不这样做,它会在你完成最后一次调用测试后继续执行(在你的例子中是字符串 "t"),它会以 return false 结束。