簡體   English   中英

使用JAVA中的遞歸解釋最大公約數

[英]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)

  1. gcd(10,5%10)= gcd(10,5)
  2. gcd(5,10%5)= gcd(5,0)
  3. 到達第三次遞歸時,它將命中基類並返回5。

我們可以使基本情況好像(a == 0 || b == 0)返回a + b;

因此,當您說返回gcd(a,b)時,該方法將再次啟動並執行其工作,直到返回long。

嗨。 謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM