0
public class Prod {
    public static void main(String[] args) {
        System.out.println(prod(1, 4));
    }
    public static int prod(int m, int n) {
        if (m == n) {
            return n;
        } else {
            int recurse = prod(m, n-1);
            int result = n * recurse;
            return result;
        }
    }
}

上記のコードを実行すると、24 ? よくわかりません どうやって?

私の疑問: 1. m =1 、 n=4 の場合、 m と n が 1 に等しくなるまで prod を呼び出します。その後、出力は n になり、そうでなければブロックは実行されませんか??

どなたかロジックの理解を助けてください。

4

3 に答える 3

1

これを数値で実行するだけで、動作を正確に確認するために書き留める必要があります (将来的には、コードに多くの出力を追加して、変数と、パススルーごとに変数がどのように変化するかを確認することをお勧めします)。

prod(1,4)
m=1,n=4
m != n so, recurse = prod(1, 3)

prod(1, 3)
m=1,n=3
m != n so, recurse = prod(1, 2)

prod(1, 2)
m=1,n=2
m != n so, recurse = prod(1, 1)

prod(1, 1)
m=1,n=1
m == n so,
return 1

returns to prod(1, 2)
recurse = 1
result = 2 * 1
return 2

returns to prod(1, 3)
recurse = 2
result = 3 * 2
return 6

returns to prod(1, 4)
recurse = 6
result = 4 * 6
return 24

したがって、プログラムは 24 を出力します。

プログラムを理解する最善の方法は、ステップを 1 行ずつ機械的に実行し、頭の中で (または紙の上で) 実行することです。

于 2013-02-20T22:37:27.310 に答える
0
prod(1, 4);

public static int prod(int m, int n) {
    if (m == n) {
        return n;
    } else {
        int recurse = prod(m, n-1);
        int result = n * recurse;
        return result;
    }
}

m == 1 で次のように変換できます。

prodA(4);
public static int prodA(int n) {
    if (1 == n) {
        return n;
    } else {
        int recurse = prodA(n-1);
        int result = n * recurse;
        return result;
    }
}

変換(ヘッド再帰)があります:

public static int prodA(int n) {
    int result = 1;
    while (n > 1) { // Actually n != 1
        result *= n;
        --n;
    }
    return result;
}

これが階乗関数です。

于 2013-02-21T00:03:05.813 に答える
0

関数を含むプログラムを理解するには、呼び出された関数が適切に機能すると仮定し、呼び出し元の関数が正しい引数を使用して正しい順序で関数を呼び出し、結果を正しく組み合わせていることを確認します。

再帰関数の場合、各再帰呼び出しが再帰のないケースに近づくことを確認する必要があります。

ここでは、結果がどうあるべきかを誰も教えてくれませんでした。再帰はいつでも終了m == nし、再帰呼び出しは でn = n - 1あるため、これは の場合にのみ機能しますm <= n

呼び出しの文字列を考えてみましょう。各呼び出しは 1 ずつ減少nしますが、m固定されたままです。n == m + 3何が起こるかを調べるために言います: 最初の呼び出しは gets m + 2、2 番目m + 1は 、3 番目mは 、そして returnmです。2 番目は3 番目n == m + 1によってm返され、2 番目はn == m + 2前の結果を取得して乗算し、最終的に結果は になり(m + 3) * (m + 2) * (m + 1) * mます。この関数n! / (m - 1)!は、 if を計算しn >= mます。これが起こっていることを知っているので、私たちの(今までの)予感が正しいことを確認するのは簡単です.

于 2013-02-20T22:49:01.733 に答える