[英]Explaining greatest common divisor using recursion in JAVA
我試圖更好地理解遞歸。 如果我正確理解了這一點,則遞歸適用於您的基本案例和原始案例的簡單版本。 因此,通常人們會看到代碼從參數中減去一個。 但是,我看到了以下代碼,如果不簡化案例,我不明白它是如何工作的。 任何解釋都會有所幫助。
public static long gcd(long a, long b) {
if (b==0)
return a;
else
return gcd(b, a % b);
}
對我來說,理解遞歸以構建遞歸樹的最簡單方法包括一些示例
gcd(10,20)------------------- 輸出:最后在這里返回10。
|
gcd(20,10)------------------- 輸出:由於輸出沒有其他反應,因此10在此處向上傳播並返回到上面的語句。
|
gcd(10,0) ------------------- 輸出:這是基本情況,返回10。
gcd(4,5)------------------- 輸出:最后在這里返回1。
|
gcd(5,4)------------------- 輸出:與下面相同,將1傳播回執行鏈
|
gcd(4,1)------------------- 輸出:由於輸出沒有其他反應,因此1在此處向上傳播並返回到上面的語句。
|
gcd(1,0) ------------------- 輸出:這是基本情況,返回1。
gcd(8,12)------------------- 輸出:最后在這里返回4。
|
gcd(12,8)------------------- 輸出:與下面相同,將4傳播回執行鏈
|
gcd(8,4)------------------- 輸出:由於輸出沒有其他反應,因此4在此處傳播並返回到上面的語句。
|
gcd(4,0) ------------------- 輸出:這是基本情況,返回4。
遍歷此類示例有助於我理解遞歸遞歸關系,從而介紹了遞歸方法的本質。
注意 :很抱歉,樹上的格式太糟糕了。 我不是SO專家,也不知道使這些“樹”看起來更好的方法。
這個特定的例子是使用歐幾里得算法 。 它指出,您可以通過取第二個數字並將其設為第一個,然后將a / b的余數獲取第二個來找到該值的gcd。 您繼續執行此操作,直到第二個數字達到0。
示例gcd(2,8)
a=2
b=8
a%b=2
所以下一個電話是gcd(8,2)
a=8
b=2
a%b=0 (since 8/2=4)
因此它將把gcd稱為剩余時間gcd(2,0)
a=2
b=0
它將達到b==0
的基本情況並返回a=2
。
我真的不明白簡化案件的意思是什么,但讓我嘗試解釋那里發生的事情。 您的基本情況是:
如果(b == 0)返回a;
通常,當我們談論遞歸時,我們要做的第一件事就是找到基本情況。 好吧,數字和0的gcd始終是數字(我們的基本情況)。
接下來,我們需要說%做什么。 5%10 = 5和10%5 = 0。 讓我們舉個例子。 gcd(5,10)
我們可以使基本情況好像(a == 0 || b == 0)返回a + b;
因此,當您說返回gcd(a,b)時,該方法將再次啟動並執行其工作,直到返回long。
嗨。 謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.