Java Recursion - 这些值来自何处?

时间:2016-06-27 20:15:44

标签: java recursion

我对以下代码感到困惑。我不知道这些值来自哪个最终被分配给变量“temp”。不知何故,奇迹般地,2和4的值最终被分配。

执行power()方法时,y> 0,方法中唯一发生的事情是power()方法调用自身,我看不到任何可以从该方法返回值2或4的东西。

我理解代码是正确的,并且这是一个递归调用,但我试图找出,具体来说,power()方法中的哪一行代码返回那些最终被赋值的值临时变量。

public static void main(String[] args) 
{
    int x = 2;
    int y = 3;      
    System.out.println("Value returned is: " + power(x,y));
}
public static int power (int x, int y)
{
    if (y <= 0)
    {
       return 1;
    }
    else
    {
       int temp = power(x, y - 1);                                   
       System.out.println("Value of temp before is: " + temp);
       System.out.println("Value of x is: " + x);
       System.out.println("value of z before is: " + z);              
       z = x* temp;          
       System.out.println("value of z after is: " + z);
       System.out.println("Value of temp after is: " + temp);
       System.out.println("***********************************************");  
       return z;
    }
}

结果如下:

Value of temp before is: 1          <==This is assigned 1 by return 1;
Value of x is: 2
value of z before is: 0
value of z after is: 2
Value of temp after is: 1
**********************************
Value of temp before is: 2         <==This is assigned by return z returning to power() method call
Value of x is: 2
value of z before is: 2
value of z after is: 4
Value of temp after is: 2
**********************************
Value of temp before is: 4         <==This is assigned by return z returning to power() method call
Value of x is: 2
value of z before is: 4
value of z after is: 8
Value of temp after is: 4
**********************************
Value returned is: 8

2 个答案:

答案 0 :(得分:3)

  1. power()以2和3作为参数调用。
  2. 此行int temp = power(x, y - 1);调用power()的新实例,其中2和2为参数
  3. 同样的事情再次发生,但是以2和1为参数
  4. 最后,调用power()的最后一个实例,使用2和0作为参数
  5. 第一次if (y <= 0)条件为真,因此power()调用的此实例执行语句return 1;
  6. 前一个power()实例获取该结果(1)并对其执行z = x* temp;,结果为2.返回该值。
  7. power()的下一个实例也是如此,将结果乘以x(2)并得到4。
  8. power()的最终实例(第一个被调用,正在等待它发起的所有递归调用的实例)最终从递归调用中返回值4,将其乘以x(2并得到8作为最终答案。
  9. 有关递归及其工作原理的更多一般信息,请参阅维基百科:https://en.wikipedia.org/wiki/Recursion

    主要思想是该方法简化了问题,然后再次调用自身,直到其中一个调用进入“基本情况”。这里的基本案例是:

    if (y <= 0)
    {
       return 1;
    }
    

    一旦基本案例得到解决,其他案例就可以根据基本案例的结果来解决。

答案 1 :(得分:1)

每次调用power时,参数的当前值都会被推送到方法堆栈中(查找&#34;堆栈&#34;在数据结构的引用中)。您必须使用笔和纸(&#34;笔测试&#34;)或在您的脑海中使用每个不同调用的新值来跟踪执行。像这样:

x=2 y=3 temp = power(2, 2)
        x=2 y=2 temp = power(2, 1)
                x=2 y=1 temp = power(2, 0)
                    x=2  y=0  return 1
                temp = 1
                z = 2 * temp = 2 * 1 = 2
                return 2
        temp = 2
        z = 2 * 2 = 4
        return 4
temp = 4
z = 2 * temp = 2 * 4 = 8
return 8