Java 将值传递给方法,然后打印它
我在一次采访中遇到了这个问题Java 将值传递给方法,然后打印它,java,Java,我在一次采访中遇到了这个问题 public class NuVizzDemo { public static void main(String args[]){ int x=6; System.out.println("initial value of x is "+x); int y=getX(x); System.out.println("value of x after method is executed is "
public class NuVizzDemo {
public static void main(String args[]){
int x=6;
System.out.println("initial value of x is "+x);
int y=getX(x);
System.out.println("value of x after method is executed is "+x);
System.out.println("value of y is "+y);
}
private static int getX(int x) {
// TODO Auto-generated method stub
if(x==1){
System.out.println("value of X is "+x);
return 0;
}
else
System.out.println("value of x is "+x);
return 1+getX(x-1);
}
}
我想知道为什么y的值比x小1?因为函数getX是并遵循以下模式:
x = 1: 0
x = 2: 1 + getX(1) = 1 + 0 = 1
x = 3: 1 + getX(2) = 1 + 1 + getX(1) = 1 + 1 + 0 = 2
...
编辑:您应该通过为x添加一个子句来使getX更加健壮,因为函数getX是并遵循以下模式:
x = 1: 0
x = 2: 1 + getX(1) = 1 + 0 = 1
x = 3: 1 + getX(2) = 1 + 1 + getX(1) = 1 + 1 + 0 = 2
...
编辑:您应该通过为x添加一个子句来使getX更加健壮,这样这个递归调用将执行5次,第5次返回值将为0,因为当x==1时,它将返回0 因此,当:
x = 1 -> 0
x = 2 -> 0 + 1 = 1
x = 3 -> 1 + 1 + getX(1) = 2
x = 4 -> 1 + 1 + 1 + getX(1) = 3
x = 5 -> 1 + 1 + 1 + 1 + getX(1) = 4
x = 6 -> 1 + 1 + 1 + 1 + 1 + getX(1) = 5
所以它是y=5。所以这个递归调用将执行5次,在第5次时返回值将为0,因为当x==1时它将返回0 因此,当:
x = 1 -> 0
x = 2 -> 0 + 1 = 1
x = 3 -> 1 + 1 + getX(1) = 2
x = 4 -> 1 + 1 + 1 + getX(1) = 3
x = 5 -> 1 + 1 + 1 + 1 + getX(1) = 4
x = 6 -> 1 + 1 + 1 + 1 + 1 + getX(1) = 5
所以它是y=5。因为
返回1+getXx-1
将为您提供值1+1+1+1+1+0=5,因为当x到达1时,您将明确返回0。因为
返回1+getXx-1
会给你1+1+1+1+1+0=5的值,因为当x到达1时,你会明确地返回0。你在面试中回答了什么?我真的不想回答这个问题,因为它会破坏面试官提出问题的努力。但是您可以运行代码,看看为什么会发生这种情况。旁注:您的else子句周围没有大括号。这不会影响结果,但它确实意味着缩进有点撒谎。您发现了一个带有//TODO自动生成方法存根!?如果你使用调试器一步一步地调试代码,你应该能够看到它在做什么。你在面试中回答了什么?我真的不想回答这个问题,因为它会破坏面试官提出问题的努力。但是您可以运行代码,看看为什么会发生这种情况。旁注:您的else子句周围没有大括号。这不会影响结果,但它确实意味着缩进有点撒谎。您发现了一个带有//TODO自动生成方法存根!?如果您使用调试器单步执行代码,您应该能够看到它在做什么。加1,一种缓慢的减去1的方法,或者如果将其设为0,则会得到StackOverflower错误;是的,这就是为什么我跳过了0:plus 1,这是一种缓慢的减去1的方法,如果你给它0,你会得到一个StackOverflower错误;是的,这就是我跳过0的原因: