递归-Can';我不理解Java中的这个简单算法

递归-Can';我不理解Java中的这个简单算法,java,recursion,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

我正在学习大学的旧试卷,以便为即将到来的考试做准备。从最简单的问题到最复杂的问题,一切都很容易理解。然而,为了我的生命,我无法想出下面的一个

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

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

return 2 * g(5-1)

return 2 * g(4-1)

等等,

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

它是一个递归函数,一次只执行一小段算术运算,然后发送其余的运算,直到满足某个结束条件

以著名的阶乘递归方法为例

public long factorial(int n) {
     return n == 0 ? 1 : n * factorial(n-1)
}
如果我们调用阶乘(3),我们需要执行以下操作

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

从这里可以看到递归展开。将这种类似的策略应用到代码片段中,您将得出为什么答案是这样的。

正如大家所说的递归,但是对于n的初始值似乎有些混淆。示例中是3

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

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

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

g(0) = return 1;
i、 例如2*2*2*1=8

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。

最好的方法是“玩电脑”:用铅笔和纸精确地描绘出发生了什么。每次通话都要缩进笔记。探索递归的最简单方法。@ThomasOwens谢谢,试卷中的程序有3作为它的值,我忘了我在测试中留下了5。我现在已经改正了。谢谢大家的回答。我很抱歉把答案弄糊涂了,到底是5还是3。想发布一个链接到这个问题的答案几乎是无法抗拒的,但我想有人已经这么做了:)现在它的
3
可能是重复的,但它不是原来的。实际上,它计算的是2^n,而不是2^(n+1)。例如,
g(0)==1
g(1)==2