回文计划没有给出正确的结果

时间:2017-09-15 19:21:13

标签: java

如果单词是一个字母,我的回文程序只给出一个真实的。即使我使用合适的回文,所有其他选项都会出错。我不知道问题是我使用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
    }
}

编辑:我编辑了它并通过了调试器。由于一些奇怪的原因,它通过并获得isPalindrome是真的,但然后再次回到循环,我不明白为什么。

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
}}

2 个答案:

答案 0 :(得分:1)

递归实现的问题在于它使用静态变量。这总是一个需要修复的坏迹象:删除isPalindrome静态变量,并用同名的局部变量替换它。

现在已完成此操作,请更改最后一种情况,以返回palindrome(s.substring(n+1, m))返回的值以解决问题。

注意:您可以优化代码结构,只有两种情况 - 基本案例和递归案例,而不是三种情况(一个字母,两个字母,两个以上的字母)。这也将修复传递空字符串导致的崩溃,因为您当前的代码在default情况下处理它。

对于长度小于2的字符串,基本情况应返回true。递归案例应继续以default案例的方式运作;请注意,它也适用于两个字母,因为空的“中间”字符串作为回文正确处理。

答案 1 :(得分:0)

就像已经提到的@dasblinkenlight一样,基本问题是你在一个recureive方法中使用静态字段。您对palindrome -method的每次调用都使用相同的字段变量。字段值在每次递归调用时都会发生变化。如果要使用递归,则应该在参数中发送方法的所有状态信息。

总的来说,这是一个检查如何设计算法的好例子。递归算法可以非常强大,但在许多情况下,同样的事情可以更简单,更健壮的方式实现。

以下是使用相同技巧的较短版本的示例:

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;
}

此示例使用空字符串作为回文。另外值得一提的是,在生产代码中还应该对param进行空检查。