-1

私は大学の古い試験問題を勉強して、次の試験の準備をしています。最も単純な問題から最も複雑な問題まで、すべてが簡単に理解できます。しかし、私は一生の間、次のことを理解することはできません。

class k{
    static int g(int n) {
        if (n==0){
            return 1;
        } else {
            return 2*g(n-1);
        }
    }
    public static void main(String[] args) {
        System.out.println(g(3));
    }
}

このコードが答えとして8を返すのはなぜですか。基本的に、入力された数値がその数値の2の累乗として計算されるべき関数であることがわかります。したがって、この場合の答えは8です。しかし実際に何が起こっているのでしょうか。理解できません。誰かが簡単な英語でそれを説明してもらえますか?本当にありがたいです。

ちなみに、質問は出力が何であるかを尋ねるだけで、理由は尋ねません。しかし、それがなぜそうなのかを知っていれば、私はより快適に感じるでしょう。

PS:人々が例として5を使用して答えを出している理由は、私が今修正した上記のコードに3ではなく5を誤って入れたためです。

4

5 に答える 5

3

これは再帰と呼ばれます。n がゼロでない限り、n を 1 減らして 2 倍します。

return 2 * g(5-1)

return 2 * g(4-1)

等..、

于 2012-04-27T17:46:29.517 に答える
2

皆さんおっしゃる通り再帰的ですが、n の初期値について若干の混乱があるようです。例では 3 です。

g(3) = return 2 * g(2);

g(2) = return 2 * g(1);

g(1) = return 2 * g(0);

g(0) = return 1;

つまり、2 * 2 * 2 * 1 = 8

于 2012-04-27T17:55:03.090 に答える
1

g(1)= 2 * g(0)= 2

g(2)= 2 * g(1)= 4

g(3)= 2 * g(2)= 8

g(4)= 2 * g(3)= 16

g(5)= 2 * g(4)= 32

g(5)は32になります。g(3)は8になります。

于 2012-04-27T17:57:00.993 に答える
1

再帰について勉強する必要があります。上記の例はそう2 ^ nです。だからn=4あなたのために得る16

于 2012-04-27T17:51:49.193 に答える
1

これは、一度に演算の一部を取り、終了条件が満たされるまで残りを送信する再帰関数です。

たとえば、よく知られている階乗再帰法を考えてみましょう。

public long factorial(int n) {
     return n == 0 ? 1 : n * factorial(n-1)
}

を呼び出す場合はfactorial(3)、次のことを行う必要があります。

factorial(3) => 3 * factorial(3-1) => 3 * 2 * factorial(2-1) => 3 * 2 * 1 * factorial(1-1)

ここから再帰展開を見ることができます。この同様の戦術をコードのスニペットに適用すると、答えがそのようになっている理由にたどり着きます。

于 2012-04-27T17:53:28.100 に答える