2016-04-07 3 views
0

このメソッドは、xoxなどの小さな入力に対してのみ機能しますが、taco catのような複雑な入力では機能しません。私はこのコードを繰り返し読んで、問題を解決できませんでした。私は、構造的に私のアプローチを調整しようとしているコードを変更し、それを修正することができなかったので、小さなエラーがあると仮定します。修正する再帰的なPalindromeチェッカー

import java.util.Scanner; 

public class Palindromes 
{ 
    static Scanner scan = new Scanner(System.in); 

    public static void main (String[] args) 
    { 
    System.out.println("Enter a string, human:"); 
    String s=scan.nextLine(); 

    if(palindrome(s)){ 
     System.out.print("This is a palindrome, I am amused Earthling."); 
    }else{ 
     System.out.print("Don't you know to speak only in palindromes to your alien Overlord?"); 
    } 
} 

public static boolean palindrome(String s){ 
    s.replace(" ",""); 

    if(s.length()<2){ 
     return true; 
    }else if(s.charAt(0)==s.charAt(s.length()-1)){ 
     return palindrome(s.substring(1,s.length()-2)); 
    }else{ 
     return false; 
    } 
} 

}

+1

あなたはブレークポイントを設定し、方法をステップ実行するために、デバッガを使用してみましたか? –

+1

'String'sは不変です。 's = s.replace(" "、" ");' – bcsb1001

答えて

3

2つのこと:

  1. あなたはスペースを削除して、結果を無視して、あなたが得られ、バックsreplaceの結果を割り当てることを忘れていました。試してみてください:

    s = s.replace(" ",""); 
    
  2. 再帰呼び出しに渡す部分文字列を取るときは、off-by-oneエラーを持っています。 ending index of substring is exclusiveなので、部分文字列の末尾にある文字数が多すぎます。試してみてください:

    return palindrome(s.substring(1,s.length()-1)); 
    
+0

迅速な対応をありがとうございます。自分のプロジェクトで作業しているときと学校で作業しているときのエラーの種類は信じられません。誰かが、メソッドを呼び出す文字列と同じに.replaceを設定する理由として、文字列が不変であるとコメントしました。この場合、暗黙のうちに私がよく知っているように、これは間違ったエラーでした。しかし、私はなぜこれが_explicitly_の場合にわかりません、誰かがjavaの文脈で不変性を説明してくれますか? – unprosaic

+0

この場合、 'String'の内容を変更しているように見えるメソッドは、' String'を変更していないので、変更された内容の別の 'String'を作成して返します。 'String'のメソッドはそれが呼び出された文字列の内容を変更しません。これは設計によるものであり、かなり意図的です。 – rgettman