2
public static void main(String args[]) {
    System.out.println(reverseString("His"));
}

public static String reverseString(String s) {
    if (s.length() <= 1) {
        return s;
    } else {
        char c = s.charAt(0);
        return reverseString(s.substring(1)) + c;
    }
}

誰かがこの方法がどのように機能するかを詳しく説明できますか

4

5 に答える 5

5

これらのタイプのメソッドがどのように機能するかを理解する最善の方法は、単純な例を使用して一度手で確認することだと思います。"abc"文字列を取り、呼び出したときに何が起こるかを考えてみましょう

reverseString("abc")

最初の反復で、elseブロックを検討します ("abc".length()は 1 以下ではないため)。メソッドは戻ります

reverseString("abc".substring(1)) + "abc".charAt(0)

これはと同等です

reverseString("bc") + 'a'

次に、 を検討する必要がありますreverseString("bc")。繰り返しますが、elseブロック内にいることに気づき、メソッドは戻ります

reverseString("bc".substring(1)) + "bc".charAt(0)

これはと同等です

reverseString("c") + 'b'

明らかに、reverseString("c")is just "c"- so reverseString("bc")is は、上記により、期待どおりを与えることを意味"cb"します。reverseString("abc")"cb" + 'a'"cba"


要約すると、基本的に次のようなことを行っています。

reverse("abc")
reverse("bc") + 'a'
reverse("c") + 'b' + 'a'
"cba" 

4 文字の文字列の場合:

reverse("abcd")
reverse("bcd") + 'a'
reverse("cd") + 'b' + 'a'
reverse("d") + 'c' + 'b' + 'a'
"dcba" 
于 2012-10-14T23:59:32.323 に答える
4

文字列 "Hello" があるとします。この文字列は左から右に再帰を実行します。

char c = s.charAt(0);

return reverseString(s.substring(1)) + c;

1) H の場合

c = 'H'

return reverseString("ELLO") + H

2) Eの場合

c = 'E'

return reverseString("LLO") + E

3) E の場合

c = 'E'

return reverseString("LLO") + E

4)Lの場合

c = 'L'

return reverseString("LO") + L

5)Lの場合

c = 'L'

return reverseString("O") + L

6) 以来、部分文字列 s<= 1

return S = 'O'

7) 再帰関数を下から上に再開し、各レベルですべての文字列を連結します

だから、O + L + L + E + H = "OLLEH"

ところで、Java では、文字列の反転は StringBuilder/StringBuffer を使用したケーキウォークです。例: StringBuffer("Hello".toReverse()).toString();

シングルスレッドのシンプルなアプリケーションを使用している場合は、StringBuilder を使用してください。

同時実行の複雑なアプリケーションは、その Synchrinized である StringBuffer を使用します。

それが役に立てば幸い。

于 2012-10-15T00:26:18.060 に答える
2

これは簡単です。

メソッドが 1 つの char 文字列で呼び出されると、同じ文字列が返されて停止します。それ以外の場合は、最後に追加する最初の文字を削除し、残りの文字で同じメソッドを呼び出します。

あなたの例を取りますHis

これはこのように動作します。

  1. 文字列の長さが 3 (>1) であるためH、最後に追加するためにそれを取り出し、 で逆メソッドを呼び出しますis
  2. 現在、文字列の長さは 2 (>1) であるためi、最後に追加するためにそれを取り出し、 で逆メソッドを呼び出しますs
  3. これで文字列の長さ1が戻りs、再帰が停止します。
  4. 最後に、 s + i + Hなど、後入れ先出しの方法で文字の追加を開始します
  5. このようにして、最終出力が として返されますsiH

他の説明方法:

   reverse("His" ) ->  reverse("is" )+H -> ( reverse("s" )+i)+H -> (s+i)+H ->siH

お役に立てれば。

于 2012-10-14T23:57:44.930 に答える
2

そこに print ステートメントをいくつか入れて、reverseStringメソッドがいつどの引数で呼び出されているかを確認します。これがあなたが得るものです:

his
is
s

したがって、関数が再帰するたびに、最初の文字が で切り捨てられs.substring(1)ます。次に、切り捨てられた最初の文字を、その部分文字列を反転した結果の末尾に追加します。上記の 3 つの呼び出しを使用すると、次のようになります。

reverse(is) + h
reverse(s) + i
s

最後のケースは 1 文字の "s" を返すだけであることに注意してください。これは再帰の基本ケースと呼ばれ、すべての再帰関数は結果を返すために必要です。

上記の 3 つの呼び出しにの結果を代入するreverse(x)と、次のようになります。

si + h
s + i
s

それがその仕組みです。文字列を逆にするには、文字 [1-n] を逆にし、その末尾に文字 0 を追加します。唯一の例外は、1 文字の文字列を反転することです。これは、その 1 文字の文字列自体を返すだけです。

于 2012-10-14T23:58:37.380 に答える
0

興味深い機能私は数年間Javaを行っていませんが、これがどのように機能するかです。

反転しているものが複数の文字であることを確認してください。そうでない場合は、それを返します。ここで行うことは、最初の文字を取得して文字列の末尾に移動し、文字列の残りの部分をその前に返すことです。

最後に、あなたのヴァーセリングが1文字になり、最初の if clausse が完全な文字列を返すようになります。:)

今、私はこの関数を解決するためのより良い方法があると確信しています. なんらかの理由で独自のものを作成する必要がある場合、Javaには逆文字列機能があると確信しています。また、それはうまくいかないかもしれません

`public static  String reverseString(String s){
    for(int x=s.length(); x>=0; x--) {
      s2 .= s.charAt(x);

    }
    return s2;`
于 2012-10-15T00:01:24.690 に答える