2013-01-08 109 views
1

我試圖創建代碼來找到三個用戶輸入數字的GCD。我的目標是用輸入數字調用該方法,除以初始化爲1的q,只有餘數爲零才記錄q,然後確定它是否大於或等於最小數目,如果不是,則增加q和回憶的方法,但如果是我想打印出最大記錄的最大q,我做錯了什麼?我不斷收到堆棧溢出錯誤。遞歸困境

public static int recursiveMethod (int x, int y, int z, int q) 
{ 
    int largestVar; 
    int xRes = x % q; 
    int yRes = y % q; 
    int zRes = z % q; 
    if (xRes==0 && yRes ==0 && zRes==0) { 
       largestVar = q; 
       if (q >= x && q >= y && q >= z) 
       { 
        return largestVar; 
       } 
    } 
    else { 
      q++; 
    } 
    return recursiveMethod(x, y, z, q); 
+0

您可以執行多少次遞歸存在限制,這受限於堆棧深度。所以我建議你檢查一下你的算法,如果有必要的話把它變成一個迭代的一個 –

回答

1

你第一種情況將是1,此時,xRes==0 && yRes ==0 && zRes==0肯定是真實的,並設置largestVar爲1。然後,因爲1是不太可能比傳入的變量,它繼續,不在else塊中增加q,並再次調用recursiveMethod q = 1!這個過程重演。

public static int recursiveMethod (int x, int y, int z, int q, int largestVar) 
{ 
    int xRes = x % q; 
    int yRes = y % q; 
    int zRes = z % q; 
    if (xRes==0 && yRes ==0 && zRes==0) { 
    //A common denominator found! 
       largestVar = q; 
    } 
    //regardless whether a denominator was found, check for the termination condition 
    //Or works here, by the way, since we only need to know when q is greater than one of them. 
    if (q >= x || q >= y || q >= z) { 
     return largestVar; 
    } 
    //if we don't terminate, increment q and recurse. 
    q++; 
    return recursiveMethod(x, y, z, q, largestVar); 
} 

修改爲正確處理largestVar。沒有注意到那一點。在本地範圍內,maximumVar的值不會通過遞歸調用進行維護,因此它也必須傳遞給recursiveMethod調用(或者聲明爲類範圍變量或其他類)。一個合適的起始值爲0.

+0

謝謝!我實際上試過這個代碼,但每次我試圖編譯它時,我總是得到「變量最大的變量可能沒有被初始化」。我還得到了一個「丟失的返回語句」,該語句應該放在方法中,但在if/else語句 – Jay

+0

以外修改爲正確處理'largestVar'。當時並沒有真正考慮這方面的問題。 – femtoRgon

4

一個我注意到的失誤,你如果條件是錯誤的:

if (q >= x && q >= y && q >= z) 

這3個數字的GCD小於或等於每個人,所以將其更改爲:

if (x >= q && y >= q && z >= q) 

如果您正在像這樣反覆測試數字,您應該從一定數量和倒數開始,以確保滿足條件的數字是實際的GCD。而且這個起始號碼必須是最少3個號碼的 並充分工作的方法的版本是在這裏:

public static int recursiveMethod(int x, int y, int z, int q) 
{ 
    int largestVar; 
    int xRes = x % q; 
    int yRes = y % q; 
    int zRes = z % q; 
    if (xRes == 0 && yRes == 0 && zRes == 0) { 
     largestVar = q; 
     if (x >= q && y >= q && z >= q) { 
      return largestVar; 
     } 
    } else { 
     q--; 
    } 
    return recursiveMethod(x, y, z, q); 
} 

樣品電話:

int x = recursiveMethod(30, 60, 45, 30); // x = 15 after this execution. 
+0

哇。我是個傻瓜,非常感謝你! – Jay

+0

我將&&更改爲||爲此,它工作正常!不過,現在我得到了「xRes」 – Jay

+0

的stackoverflow哦,我明白了。我對這件事的看法更加複雜。因爲我需要這個程序來處理隨機輸入的數字。 – Jay

2

不要忘記gcd(x, y, z) = gcd(gcd(x, y), z).所以,如果你想有一個簡單的算法,可以實現與GCD兩個數字,然後調用該方法的3個數字。

public static int GCD(int x, int y) { 
    if (y == 0) return x; 
    return GCD(x, x % y); 
} 

然後爲三個數字:

public static int GCDfor3 (int x, int y, int z) { 
    return GCD(GCD(x, y), z) 
}