回文测试:调试

时间:2015-02-09 20:43:29

标签: java debugging recursion palindrome

我在查找代码中的错误时遇到了麻烦。我知道有一个,除了我不确定它是什么。我是编码的新手,这只是我的第二个学期,我的教授让我们跳到本书末尾学习递归,但是在实验室中,本书指出作者希望我们实施其他技能,这些技巧将在我们避开的章节中学到还没去过。换句话说,我正在使用我尚未学到的东西,所以我没有在这里看到错误。任何能够弄清楚我做错了什么的人,并解释一下我的帮助将不胜感激!谢谢!

    if (palTest(s.toLowerCase().replaceAll("\\W","")))
        System.out.println("\nYour phrase is a palindrome!");

    public static boolean palTest(String str)
    {

        char first = str.charAt(0);
        char last = str.charAt(str.length() - 1);


        System.out.println(str);
        System.out.println(first + " --- " + last);
        System.out.println("----------------\n");


        if (str.length() <= 2)
            return true;
        else if (first != last)
            return false;
        else
            return palTest(str.substring(1, str.length()-1));
    }

if语句是我对palTest方法的调用。现在这段代码几乎适用于我输入的所有短语。但是,当我输入这个短语时: “Dessertsm I强调”它会将字母 m 与姓氏 i 最后比较并返回 true 并说出来短语是一个回文。

我放了一些System.out.println语句,所以我可以确切地看到发生了什么,这是它打印出来时的样子。

Please enter a phrase you wish to test to discover if it it a palindrome: 
dessertsm i stressed

dessertsmistressed
d --- d
----------------

essertsmistresse
e --- e
----------------

ssertsmistress
s --- s
----------------

sertsmistres
s --- s
----------------

ertsmistre
e --- e
----------------

rtsmistr
r --- r
----------------

tsmist
t --- t
----------------

smis
s --- s
----------------

mi
m --- i
----------------


Your phrase is a palindrome!

字母 m 可以替换为任何东西,并返回相同的字母。请帮忙!谢谢!

1 个答案:

答案 0 :(得分:5)

这是因为如果长度为2,则停止递归。等到它小于2才能停止。所以改变这个:

if (str.length() <= 2)
    return true;

到此:

if (str.length() < 2)
    return true;

然后问题是它会在早期检查中崩溃,因此将其移动到方法的开头。所以基本上,任何字符串长度&lt; 2通常是一个回文,你不需要对它进行任何检查;只是回归真实。它只适用于需要比较第一个和最后一个字符的较长字符串。您的最终代码应如下所示:

public static boolean palTest(String str)
{
    if (str.length() < 2) return true;

    char first = str.charAt(0);
    char last = str.charAt(str.length() - 1);

    if (first != last){
        return false;
    } else{
        return palTest(str.substring(1, str.length()-1));
    }
}