1

私はこの再帰的な階乗関数を持っています:

public class Driver{
public static void main (String args[])
{

    System.out.println(factorial(5));

}

private static int factorial(int n)
{
    int product;
    if (n <= 2){ product = n; return 2;}
    else{
        product = n * factorial(n-1);
        System.out.println("current product =" + product);
        System.out.println("product = " + n + " * factorial(" + (n-1) + ")");
    }
    return product;
}
}

次のように出力されます。

current product =6
product = 3 * factorial(2)
current product =24
product = 4 * factorial(3)
current product =120
product = 5 * factorial(4)
120

私は一体何がここで起こっているのかを理解しようとしています。n = 2で印刷が開始される方法がわかりません。また、現在の製品= 6はどこから来たのですか?ありがとう!

4

1 に答える 1

4

n==2は基本ケースであるため、以下の行を通過する最初の関数は、n-1 == 2またはの関数n == 3です。これは、出力が再帰呼び出しの後に実行されるため、最も深い呼び出しが最初に出力されるためです(Patricia Shanahanに感謝)。大きいものから小さいものへと印刷したい場合は、再帰的printlnに呼び出す行の上に行を移動します。factorial

product = n * factorial(n-1);

また

if (n <= 2){ product = n; return 2;}

これは非常に多くの理由で間違っています。

そのはず

if (n <= 1){ return 1;}

これを理解するのに問題がある場合は、階乗の各呼び出しが他の呼び出しから独立していることを覚えておいてください。

于 2013-03-07T03:04:27.717 に答える