使用递归的回文程序

时间:2014-04-06 15:51:13

标签: java palindrome

这是我目前用于计算机科学课程的Palindrome课程。我有它非常有效,除非一个单词是回文,它是一个无限循环。我知道我必须插入一个数字基础案例,但我不知道如何做到这一点......我真的无法理解递归。感谢帮助。

public class PalindromeTester
{
    public static void main(String[] args)
    {
        Scanner scan = new Scanner (System.in);

        String str, another = "y";
        int left, right;

        while (another.equalsIgnoreCase("y"))
        {

            System.out.println("Enter a potential palindrome:");
            str = scan.next();

            left = 0;
            right = str.length() - 1;

            tester(str, left, right);

            System.out.println();
            System.out.println("Test another palindrome (y/n)?");
            another = scan.next();

        }
    }

    public static void tester (String str, int left, int right)
    {
        Scanner scan = new Scanner (System.in);


        while (str.charAt(left) == str.charAt(right) && left < right)
        {
            System.out.println(str);

            tester( str, left + 1, right -1);

        }
        if (left < right)
        {
            System.out.println("That string is NOT a palindrome.");
        }

        else 
        {

            System.out.println("That string IS a palindrome.");
        }

    }
}

3 个答案:

答案 0 :(得分:1)

您正在使用while循环。使用递归,这是隐式完成的。

您必须以小部分拆分算法。

[]代表左,{}代表右。

[1] 2 3 4 5 6 7 8 9 0 9 8 7 6 5 4 3 2 {1} -->Level 0
1 [2] 3 4 5 6 7 8 9 0 9 8 7 6 5 4 3 {2} 1 -->Level 1
1 2 [3] 4 5 6 7 8 9 0 9 8 7 6 5 4 {3} 2 1 -->Level 2
1 2 3 [4] 5 6 7 8 9 0 9 8 7 6 5 {4} 3 2 1 -->Level 3
1 2 3 4 [5] 6 7 8 9 0 9 8 7 6 {5} 4 3 2 1 -->Level 4
1 2 3 4 5 [6] 7 8 9 0 9 8 7 {6} 5 4 3 2 1 -->Level 5
1 2 3 4 5 6 [7] 8 9 0 9 8 {7} 6 5 4 3 2 1 -->Level 6
1 2 3 4 5 6 7 [8] 9 0 9 {8} 7 6 5 4 3 2 1 -->Level 7
1 2 3 4 5 6 7 8 [9] 0 {9} 8 7 6 5 4 3 2 1 -->Level 8
1 2 3 4 5 6 7 8 9 {[0]} 9 8 7 6 5 4 3 2 1 -->Level 9

因此,tester将一直持续到:

  1. 我们到达了这个词的中间位置。
  2. 这个词不是回文
  3. 案例2的例子:

    [1] 2 3 A 5 6 7 8 9 0 9 8 7 6 5 4 3 2 {1} 
    1 [2] 3 A 5 6 7 8 9 0 9 8 7 6 5 4 3 {2} 1 
    1 2 [3] A 5 6 7 8 9 0 9 8 7 6 5 4 {3} 2 1 
    1 2 3 [A] 5 6 7 8 9 0 9 8 7 6 5 {4} 3 2 1 --> !!!
    

    我认为这种方法非常有助于理解这种递归是如何工作的

    public static String positions(String word, int l, int r) {
            char[] a = word.toCharArray();
            String s = "";
            // [letter] if left, {} if right, [{}] if both 
            for (int i = 0; i < a.length; i++) {
                if (l == i && r == i) {
                    s += "{[" + a[i] + "]}";
                } else if (l == i) {
                    s += "[" + a[i] + "]";
                } else if (r == i) {
                    s += "{" + a[i] + "}";
                } else {
                    s += a[i];
                }
                s+=" ";
            }
            return s;
    
        }
    

    最后,tester方法。

    public static boolean tester(String str, int left, int right) {
    
            System.out.println(positions(str, left, right) +" tester(str, "+left +", "+right+")");
            if (left>=right) // case 1
                return true; // that's ok, we've reached the middle
                // the middle was not reached yet.
                // is the condition satisfied?
            if (str.charAt(left) == str.charAt(right)) {
                // yes. So, lets do it again, with the parameters changed
                return tester(str, left + 1, right - 1);
    
            } 
            //the condition was not satisfied. Let's get out of here.
            else {
    
                return false;
            }
    
        }
    

    一些输出:

    Enter a potential palindrome:
    1234567890987654321
    [1] 2 3 4 5 6 7 8 9 0 9 8 7 6 5 4 3 2 {1}  tester(str, 0, 18)
    1 [2] 3 4 5 6 7 8 9 0 9 8 7 6 5 4 3 {2} 1  tester(str, 1, 17)
    1 2 [3] 4 5 6 7 8 9 0 9 8 7 6 5 4 {3} 2 1  tester(str, 2, 16)
    1 2 3 [4] 5 6 7 8 9 0 9 8 7 6 5 {4} 3 2 1  tester(str, 3, 15)
    1 2 3 4 [5] 6 7 8 9 0 9 8 7 6 {5} 4 3 2 1  tester(str, 4, 14)
    1 2 3 4 5 [6] 7 8 9 0 9 8 7 {6} 5 4 3 2 1  tester(str, 5, 13)
    1 2 3 4 5 6 [7] 8 9 0 9 8 {7} 6 5 4 3 2 1  tester(str, 6, 12)
    1 2 3 4 5 6 7 [8] 9 0 9 {8} 7 6 5 4 3 2 1  tester(str, 7, 11)
    1 2 3 4 5 6 7 8 [9] 0 {9} 8 7 6 5 4 3 2 1  tester(str, 8, 10)
    1 2 3 4 5 6 7 8 9 {[0]} 9 8 7 6 5 4 3 2 1  tester(str, 9, 9)
    true
    
    Test another palindrome (y/n)?
    y
    Enter a potential palindrome:
    12345A678654321
    [1] 2 3 4 5 A 6 7 8 6 5 4 3 2 {1}  tester(str, 0, 14)
    1 [2] 3 4 5 A 6 7 8 6 5 4 3 {2} 1  tester(str, 1, 13)
    1 2 [3] 4 5 A 6 7 8 6 5 4 {3} 2 1  tester(str, 2, 12)
    1 2 3 [4] 5 A 6 7 8 6 5 {4} 3 2 1  tester(str, 3, 11)
    1 2 3 4 [5] A 6 7 8 6 {5} 4 3 2 1  tester(str, 4, 10)
    1 2 3 4 5 [A] 6 7 8 {6} 5 4 3 2 1  tester(str, 5, 9)
    false
    
    Test another palindrome (y/n)?
    

    main方法中,

    System.out.println(tester(str, left, right));
    

    要查看true/false输出

答案 1 :(得分:0)

由于您正在使用递归(其基本用途主要用于消除循环),因此while方法中的tester()循环不应该是if吗?

public static void tester (String str, int left, int right)
{
    Scanner scan = new Scanner (System.in);

    if (str.charAt(left) == str.charAt(right) && left < right)
    {
        System.out.println(str);

        tester( str, left + 1, right -1);

    }
    else if (left < right)
    {
        System.out.println("That string is NOT a palindrome.");
    }

    else 
    {
        System.out.println("That string IS a palindrome.");
    }
}

答案 2 :(得分:-1)

我修改了您的tester()方法并将while替换为if,并移动了您的第二个if子句。

public static void tester(String str, int left, int right) {
        if (str.charAt(left) == str.charAt(right) && left < right) {
            tester(str, left + 1, right - 1);
        } else {
            if (left < right) {
                System.out.println("That string is NOT a palindrome.");
            } else {
                System.out.println("That string IS a palindrome.");
            }
        }
    }