-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 为例给出答案的原因是我在上面的代码中错误地把 5 而不是 3 放在了上面,我现在已经更正了。

4

5 回答 5

3

这称为递归。除非 n 为零,否则将 n 减 1 并乘以 2。

return 2 * g(5-1)

return 2 * g(4-1)

ETC..,

于 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

你应该学习递归。上面的例子确实如此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 回答
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 回答