2015-11-07 67 views
0

我想實現一個遞歸函數來計算兩個數字的gcd,但我的代碼不工作,任何想法有什麼不對?遞歸函數來計算最大公約數

public static int gcd(int a, int b) { 
    if (a == b) { 
     return a; 
    } 

    while (a != b) { 
     if (a > b) { 
      gcd(a - b, b); 
     } else if (b > a) { 
      gcd(a, b - a); 
     } 
    } 
    return a; 
} 
+0

一般來說,遞歸策略和'while'循環是互斥的。希望這有助於提示。 – CollinD

回答

2

如果您使用遞歸,則不需要while循環。只要做到:

public static int gcd(int a, int b) { 
    if (a == b) { 
     return a; 
    } 

    if (a > b) 
     return gcd(a - b, b); 

    return gcd(a, b - a); 
} 

順便說一句,while (a != b)是一個無限循環,如果達到它。

+0

爲什麼這是一個無限循環?當你再次調用函數時,參數a和b是否改變? – Maxim

+0

@Maxim你預計a和b會發生什麼變化?你永遠不會改變a和b的值。它們是原始數據類型,它們不是對象。當再次用較小的a或b值調用函數時,它們的值在函數的當前堆棧中不會改變。 – Bon

+0

明白了!非常感謝你! – Maxim