Java 回文程序没有给出正确的结果
我的回文程序只在单词是一个字母时给出一个true。所有其他选项都给出false,即使我使用了正确的回文。我不知道问题是我使用s.length还是什么。代码如下:Java 回文程序没有给出正确的结果,java,Java,我的回文程序只在单词是一个字母时给出一个true。所有其他选项都给出false,即使我使用了正确的回文。我不知道问题是我使用s.length还是什么。代码如下: package palindrome; import java.util.Scanner; public class Palindrome { static String pal; //entered string static int n = 0; //used to control substrings
package palindrome;
import java.util.Scanner;
public class Palindrome {
static String pal; //entered string
static int n = 0; //used to control substrings
static boolean isPalindrome; //boolean to control if the string is a palindrome
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//create scanner
System.out.print("Enter a string: ");
pal = scan.nextLine(); //turn input into string
palindrome(pal); //use palindrome method
if (isPalindrome == true) { // if it is palindrome, use this message
System.out.println("The string is a palindrome");
} else { //if not, use this method
System.out.println("The string is not a palindrome");
}
}
static boolean palindrome(String s) {
int m = s.length() - 1; //use this int to create the upper limit for string
switch (s.length()) {
case 1: // if the word is one letters, it is a palindrome
isPalindrome = true;
break;
case 2: //if the word is two letters, compare the two letters to determine if it is a palindrome
if (s.charAt(0) == s.charAt(1)) {
isPalindrome = true;
} else {
isPalindrome = false;
}
break;
default: //recursively determine if it is a palindrome
if (s.charAt(n) == s.charAt(m)) {
palindrome(s.substring(n++, m));
} else {
isPalindrome = false;
}
break;
}
return isPalindrome; //return the boolean
}
}
编辑:我编辑了它并通过了调试器。出于某种奇怪的原因,它经过并使isAlindrome为真,但随后又回到循环中,我真的不明白为什么
public class Palindrome {
static String pal; //entered string
static int n = 0; //used to control substrings
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);//create scanner
System.out.print("Enter a string: ");
pal = scan.nextLine(); //turn input into string
palindrome(pal); //use palindrome method
if(palindrome(pal) == true) // if it is palindrome, use this
message
{
System.out.println("The string is a palindrome");
}
else //if not, use this method
{
System.out.println("The string is not a palindrome");
}
}
static boolean palindrome(String s)
{
boolean isPalindrome = false;
switch (s.length()) {
case 1: // if the word is one letters, it is a palindrome
isPalindrome = true;
break;
case 2:
if(s.charAt(0) == s.charAt(1))
{
isPalindrome = true; break;
}
else isPalindrome = false; break;
default: //recursively determine if it is a palindrome
if (s.charAt(0) == s.charAt(s.length()-1))
{palindrome(s.substring(1, s.length()-1));}
else
{isPalindrome = false;}
break;
}
return isPalindrome; //return the boolean
}}
递归实现的问题在于它使用静态变量。这始终是一个需要修复的错误标志:删除isPalindrome
静态变量,并用同名的局部变量替换它
既然这样做了,请更改最后一个案例,以返回回文(s.substring(n+1,m))返回的值。来解决此问题
注意:您可以将代码结构优化为只有两种情况—基本情况和递归情况,而不是三种情况(一个字母、两个字母、两个以上字母)。这还将修复由于传递空字符串而导致的崩溃,因为当前代码在default
情况下处理它
对于长度小于2的字符串,基本大小写应返回
true
。递归case应该继续按照默认值case的方式操作;请注意,它也适用于两个字母,因为空的“中间”字符串被正确处理为回文。与前面提到的@dasblinkenlight一样,基本问题是在递归方法中使用静态字段。对回文方法的每次调用都使用相同的字段变量。字段值在每次递归调用时都会发生变化。若要使用递归,则应在参数中发送方法的所有状态信息
总的来说,这是检查如何设计算法的一个很好的案例。递归算法可能非常强大,但在许多情况下,同样的事情可以通过更简单、更健壮的方式实现
下面是一个简短版本的示例,用于实现相同的技巧:
public static boolean isPalindrome(String s) {
int i = 0;
int j = s.length() - 1;
while (i <= j) {
if (s.charAt(i++) != s.charAt(j--))
return false;
}
return true;
}
public静态布尔值isAlindrome(字符串s){
int i=0;
int j=s.长度()-1;
while(我已经试过调试了吗?去掉全局isAlindrome
标志。palindrome
同时返回一个值并设置一个全局标志。它应该只返回一个值。执行此操作,您可能会在过程中发现问题。返回s.equals(新的StringBuilder.reverse().toString());