递归-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=8g(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
。