Java递归和局部变量

时间:2014-12-05 18:05:31

标签: java variables recursion methods

因此,在以下方法中,有两个整数basen

powerN(base, n-1) * base发生时,究竟会发生什么?

只有base成倍增加,但方法中有两个局部变量,那么为什么n-1base都不会乘以基数,因为它们都是方法的一部分?

(对不起,如果这是一个新的问题,但我似乎无法掌握这个概念。)

public int powerN(int base, int n)
{
    if (n == 0) {
       return 1;
    } else {
       return (powerN(base, n-1) * base); 
    }
}

2 个答案:

答案 0 :(得分:4)

以下是示例值的操作顺序:

base = 3, n = 4
Is 4 == 0? No
powerN(3, 3) * 3
    base = 3, n = 3
    Is 3 == 0? No
powerN(3, 2) * 3 * 3
        base = 3, n = 2
        Is 2 == 0? No
powerN(3, 1) * 3 * 3 * 3
            base = 3, n = 1
            Is 1 == 0? No
powerN(3, 0) * 3 * 3 * 3 * 3
                base = 3, n = 0
                Is 0 >= 0? Yes, return 1.  // Base Case
1 * 3 * 3 * 3 * 3
81

powerN(base, n - 1)确实乘以base,但直到该递归调用返回为止。基础案例,最深层嵌套的调用,首先返回1。然后乘法发生,每次递归调用一次,递归调用依次返回3927,原始调用返回81

答案 1 :(得分:0)

Java是按值传递的。当你调用powerN()时,它不引用局部变量,它会复制。请考虑以下代码:

public func( int x ) {
   x = x + 1;
}

public void test() {
   int x = 1;
   func( x );
   System.out.println( x ); // x = 1, not 2
}

递归使得更难以看到真正的问题。