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の組み込み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

コードの 2 つの間違い:

  1. 文字列は不変
    である ためs.toLowerCase()、に変更を加えることはありませんsString
    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 に答える