2014-12-05 76 views
0

所以在下面的方法中,有兩個整數,basenJava遞歸和局部變量

powerN(base, n-1) * base發生時,究竟發生了什麼?

只有base會相乘,但方法內部有兩個局部變量,爲什麼n-1base都不乘以基數,因爲它們都是方法的一部分?

(很抱歉,如果這是一個newbish問題,但我似乎無法掌握這個概念)

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

回答

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。然後進行乘法運算,每次遞歸調用一次,遞歸調用依次返回3,9,27,原始調用返回81

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 
} 

遞歸使得難以看到真正的問題。