1

階乗プログラムを書き留めています。プログラム全体が完成しましたが、問題なく動作しています。ただし、出力を次のようにしたい

Begin Factorial Program. . . 
Provide number and the factorial will be computed: 4
4! is . . . 
In f(4) and calling f(3) . . . 
In f(3) and calling f(2) . . . 
In f(2) and calling f(1) . . . 
In f(1) and calling f(0) . . . 
  In f(0) and computing f(0). Returning 1
f(1) is 1 * 1 which equals 1. Returning 
f(2) is 2 * 1 which equals 2. Returning 2
f(3) is 3 * 2 which equals 6. Returning 6
f(4) is 4 * 6 which equals 24. Returning 24
4! = 24

どうやって手に入れますか。

f(1) is 1 * 1 which equals 1. Returning 
f(2) is 2 * 1 which equals 2. Returning 2
f(3) is 3 * 2 which equals 6. Returning 6
f(4) is 4 * 6 which equals 24. Returning 24

私の方法で印刷する

これは私が持っている方法です

public static int factorial(int num) {
    if (num == 0) {
        System.out.println("In f(" + num + ") and computing f(" + num
                + "). Returning " + 1);
        return 1;
    } else {
        System.out.println("In f(" + num + ") and calling f(" + (num - 1)
                + ") . . .");


        return num * factorial(num - 1);
    }

印刷する

4! is . . .
In f(4) and calling f(3) . . .
In f(3) and calling f(2) . . .
In f(2) and calling f(1) . . .
In f(1) and calling f(0) . . .
In f(0) and computing f(0). Returning 1
4! = 24
4

4 に答える 4

1

このような何かがうまくいくはずです:

public static int factorial(int num) {
    if (num == 0) {
        System.out.println("In f(0) and computing f(0). Returning 1");
        return 1;
    }

    System.out.printf("In f(%d) and calling f(%d) . . .%n", num,
                num - 1);  // #1

    int factorial = factorial(num - 1);
    int result = num * factorial;

    System.out.printf(
        "f(%1$d) is %1$d * %2$d which equals %3$d. Returning %3$d%n",
            num, factorial, result);  // #2

    return result;
}
f(4) で f(3) を呼び出します。. .
f(3) で f(2) を呼び出します。. .
f(2) で f(1) を呼び出します。. .
f(1) で f(0) を呼び出します。. .
f(0) および f(0) の計算中。1を返します
f(1) は 1 * 1 で、1 に等しい。1 を返す
f(2) は 2 * 1 で、2 に等しい。2 を返す
f(3) は 3 * 2 で、6 に等しい。6 を返す
f(4) は 4 * 6 で、24 に等しい。24 を返す
24

factorial再帰呼び出しが 2 つの print ステートメントの間に挟まれていることに注意してください (結果をインラインで使用するのではなく、新しい変数に格納することでこれを行います)。その結果、最初のすべての print ステートメント ( #1) が 2 番目のステートメント ( ) の前に実行さ#2れ、目的の形式になります。

また、このような場合、printfはるかに理にかなっていて、物事を読みやすく/開発しやすくします。

于 2013-04-23T21:54:25.720 に答える
0

「factorial(num - 1);」を取り出します。return ステートメントから呼び出し、一時変数に保持します。

int retVal = factorial(num-1)
System.out.println("I'm about to return "+retVal);
return retVal;
于 2013-04-23T21:49:41.377 に答える
0

あなたは、あなたが求めている追加のログステートメントを作成することを自分自身に与えずに、まっすぐに戻っています。あなたがする必要があるのは、返されたものと等しい変数を設定することです。次に、「Returning」ステートメントを出力して、返すことができます。

于 2013-04-23T21:47:27.537 に答える