我正在学习我大学的旧试卷,以便为即将到来的考试做准备。从最简单的问题到最复杂的问题,一切都很容易理解。但是,对于我的生活,我不能想出下面的一个。
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,我现在已经纠正过了。答案 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.