Java 回文程序没有给出正确的结果

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

我的回文程序只在单词是一个字母时给出一个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
    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());