再帰的な文字列逆シーケンスの使用

1903 ワード

再帰的な文字列逆シーケンスの使用
次のコードは、文字列の逆シーケンス出力を実現します.
/**     s    ,  abcde    edcba */
public String reverse(String s) {
    return s.length() > 0 ? reverse(s.substring(1)) + s.charAt(0) : "";
}

たとえば、実行方法reverse("abcde");は、結果edcbaを返します.
どうやってこの方法を理解しますか?
理解を容易にするために、私たちは以上の方法を単行改造し、改造後の価格方法は以下の通りである.
/**     s    ,  abcde    edcba */
public static String reverse(String s) {
    boolean isNotEmpty = s.length() > 0;
    if (isNotEmpty) {
        String substring = s.substring(1);
        String reverse = reverse(substring);
        String result = reverse + s.charAt(0);
        return result;
    }
    return "";
}

その後,作成後のメソッドブレークポイントをDebug行うことで,再帰メソッドの実行フローを明らかにすることができる.
例えばreverse("abcde")を実行し、具体的な実行プロセスは以下の通りである.
//         5   ,      5 
1. substring("abcde");
2. substring("bcde");
3. substring("cde");
4. substring("de");
5. substring("e");

//      5    ,    ,      ,      :
5. e
4. d
3. c
2. b
1. a

再帰実行プロセスのまとめ:
  • メソッドが返す順序は、メソッドが実行する順序と逆である.
  • は、最後に実行された方法であり、最初に戻り、最初に実行された方法であり、最後に戻る.
  • 再帰的アプローチは、1つのインスタックおよびアウトスタックのプロセスと同様に、戻るプロセス全体を実行する.

  • 再帰的配列逆シーケンスの使用
    考え方:両端から中間に向かって両端位置の値を順番に交換し、交換が完了するまで.たとえば、長さ6の配列の場合、交換プロセスは次のようになります.
    0:5交換0と5位置の要素1:4交換4と4位置の要素2:3交換2と3位置の要素3:2交換完了、再帰終了
    /**
     *           ;
     *             :
     *  1       1 
     *  2       2 
     *  3       3 
     * ...
     */
    public void reverseArray(int[] array, int start, int end) {
        //             
        if (start < end) {
            int temp = array[end];
            array[end] = array[start];
            array[start] = temp;
            reverseArray(array, start + 1, end - 1);
        }
        //       ,    
        System.out.println(Arrays.toString(array));
    }