递归 - 无法理解Java中的这个简单算法

时间:2012-04-27 17:44:58

标签: java recursion

我正在学习我大学的旧试卷,以便为即将到来的考试做准备。从最简单的问题到最复杂的问题,一切都很容易理解。但是,对于我的生活,我不能想出下面的一个。

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,我现在已经纠正过了。

5 个答案:

答案 0 :(得分:3)

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

return 2 * g(5-1)

return 2 * g(4-1)

等。,

答案 1 :(得分: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

答案 2 :(得分:1)

你应该学习recursion。上面的示例执行2 ^ n。因此,对于n=4,您获得16

答案 3 :(得分: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)

你可以从这里看到递归扩展。将这种类似的策略应用于您的代码片段,您将得出答案的原因。

答案 4 :(得分: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.