0

我正在尝试编写代码来告诉用户他们输入的单词是否是回文。

我正在使用递归方法来反转单词,但它没有正确终止。当StackOverFlowError我测试它时出现。我的终止代码对我来说看起来是正确的,所以我不确定它为什么不起作用。

此外,当我尝试将String对象全部设为小写字符时,调试器是否显示该单词全部小写,还是保持不变?

这是代码:

public class Palindrome
{
private String word;

/**
 * Constructor for objects of class PalindromeTester
 */
public Palindrome(String supposedPalindrome)
{
    word = supposedPalindrome;
}

/**
 * Tests if the word is a palindrome or not.
 */
public void testPalindrome()
{
    String reversed = reverse();
    if(reversed.equals(word.toLowerCase()))
    {
        System.out.println(word + " is a palindrome!");
    }
    else
    {
        System.out.println(word + " is not a palindrome.");
    }    
}

/**
 * Reverses the word.
 * 
 * @return the reversed string.
 */
private String reverse()
{
    return reverseHelper(word);
}

/**
 * A recursive method that reverses the String for the
 * reverse the string method.
 * 
 * @return the reversed string.
 */
private String reverseHelper(String s)
{
    s.toLowerCase();
    if(s.length() <= 1)
    {
        return s;
    }
    else
    {
        return reverseHelper(s.substring(1, s.length()) + s.charAt(0));
    }
}
}

感谢您的帮助!

4

3 回答 3

1

当有内置方法时,为什么要使用递归系统?

public class Palindrome() {
  public Palindrome(String supposedPalindrome) {
    if( supposedPalindrome.equals(new StringBuffer(supposedPalindrome).reverse().toString())) {
      System.out.println(supposedPalindrome+" is a palindrome!");
    }
    else {
      System.out.println(supposedPalindrome+" is not a palindrome!");
    }
  }
}

或者类似的东西,使用StringBuffer's 的内置reverse()方法。

于 2013-03-03T03:14:55.477 回答
0

字符串是不可变的。String.toLowerCase(String) 返回一个新字符串。

代替

s.toLowerCase();

s = s.toLowerCase();

甚至更好

return reverseHelper(word.toLowerCase());

并删除

s.toLowerCase();
于 2013-03-03T03:28:33.800 回答
0

您的代码中有两个错误:

  1. String 是不可变
    的 ,因此s.toLowerCase()不会对 进行任何更改s,您需要分配回String
    s = s.toLowerCase();

  2. 您的递归方法有
    return reverseHelper(s.substring(1, s.length()) + s.charAt(0));
    问题,它总是传递String长度s.length() (我的意思是如果String s长度为5,那么您的递归调用总是传递长度为 5 的字符串,只有字符的位置被更改)

建议:

  1. 让您递归调用以缩短您的字符串,以便if在字符串反转后最终匹配条件
  2. 或者使用StringBuilder#reverse()方法来反转你的字符串
于 2013-03-03T03:41:21.483 回答