2

そのため、この間ずっと、再帰に関する私の問題はケースを理解することだと思っていました。私の問題は、再帰的なケースの値を理解することであることがわかりました。たとえば、配列の一部を逆方向に出力します。

オリジナルトライ

    public static void printBackwards(int i, int j, char[] A){
        if(i == j){
            System.out.println(A[i]); 
        }
        else{
            printBackwards(i+1,j,A);
        }

    }

実用的な試み

    public static boolean printBackwards(int i, int j, char[] A){
    if(i == j){
            System.out.println(A[i]);
            return true;
    }
    else{
            if(printBackwards(i+1,j,A) == true){
                System.out.println(A[i]);
                return true;
            }
            else{
                printBackwards(i+1,j,A);
            }
    }
    return false;
    }

しかし、これは効率的な再帰ですか? またはそれを介してより良い方法はありますか?これは、私がそれを書いて見たときに理解できる唯一の方法です。

4

3 に答える 3

2

私の意見では、この問題を解決するために再帰を使用する必要はありません。単純なループでそれを行うことができます。

public class PrintBackwards {

    public static void main(String[] args) {
        char[] a = new char[] {'A', 'B', 'C', 'D'};

        for(int i = a.length - 1; i >= 0; i--) {
            System.out.println(a[i]);
        }
    }
}

再帰を使用する理由は何かありますか? そうでない場合は、上記の例のように実行する方が高速です。

再帰を使用したい場合は、この例があなたの例よりも簡単に理解できることを願っています.

public class PrintBackwards {

    private static char[] a = new char[]{'A', 'B', 'C', 'D'};

    public static void main(String[] args) {
        printBackwards(0);
    }

    public static void printBackwards(int i) {
        if (i < a.length) {
            printBackwards(++i);
            System.out.println(a[i - 1]);
        }
    }
}
于 2012-05-16T02:05:02.053 に答える
1

「問題をすぐに解決できるのはいつですか (再帰呼び出しなしで)」と尋ねることから始めます。この場合、領域に要素が 1 つしかない場合になります。これが基本ケースです。

それが当てはまらない場合は、問題を分割して小さなバージョンを作成し (これは printBackwards を呼び出すことで解決できます)、問題を解決するために残っているものをすべて作成する必要があります。A[i+1..j] (i の元の値) を出力する呼び出しが既にあります。したがって、あとは A[i] を出力するだけです。配列の残りの部分の前または後に印刷する必要があるかどうかを判断すれば、準備は完了です。

于 2012-05-16T01:51:36.360 に答える
1

配列を逆の順序で出力する Java コードは次のとおりです。

public class TestProgram {

    private int[] a = {4, 2, 7, 1, 9, 5, 8};

    public static void main(String[] args) {
        TestProgram p = new TestProgram();
        p.print(a.length - 1);
    }

    public void print(int i) {
        // the anchor of the recursive method
        // it indicates that we are done printing array
        if (i < 0) 
            return;

        // print the current value
        System.out.printf("%d ", a[i]);

        // recursively call print() method
        print(i - 1);
    }
}
于 2012-05-16T02:41:08.060 に答える