2017-07-30 40 views
-3

我试图理解这种递归方法,但我感到困惑。不同调用的Java递归方法 - 难以遵循的变量值

输出是: X:3 X:4 X:3 Y:4

我终于明白了这一步:在第一个x:3被打印出来,因为我们通过数字3和4.然后它再次用x-1,y调用该方法。但职位交换。请解释第二次方法调用后x和y的值在不同的点上以及它们在每次调用后如何改变。谢谢。

public class Test { 

     public static void obscure (int x, int y){ 

     if (x * y <= 4){ 
      return; 
     } 
     System.out.println("x: " + x); // X ist 4 

     if (x >= y){ 
      obscure(x-1, y); 
     }else{ 
      obscure(y,x-1); 
      System.out.println("y: " + y); 
    } 
} 

    public static void main(String[] args){ 
    obscure(3,4); 
    } 
} 
+0

使用调试器。 –

+0

'但是职位交换'这是正确的。 '如果(x> = y){' - 'x'这里是'3','y'是'4'。它转到'else'块,将'y'作为第一个参数,将'x-1'作为第二个参数。 – BackSlash

+1

欢迎来到Stack Overflow!它看起来像你需要学习使用调试器。请帮助一些[互补调试技术](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之后仍然遇到问题,请随时回答一个更具体的问题。 –

回答

1

在此代码会发生什么:

first call: obscure(3,4) //x=3,y=4 
    output: x:3 
    else clause (not x(3) >= y(4)) 
     second call: obscure (4,2) //x=4,y=2 
      output: x:4 
      if clause (x(4) >= y(2) 
       third call: obscure(3,2) //x=3,y=2 
        output: x:3 
        if clause (x(3) >= y(2)) 
         fourth call: obscure(2,2) //x=2, y=2 
          x(2)*y(2) <= 4 //returns 
         end of fourth call 
       end of third call 
     end of second call 
     output in else clause of first call: y:4 
end of first call