在 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) ------------------ output: 最后这里返回10.
|
gcd(20, 10)-------------------- output: 由于输出没有发生其他任何事情,10 在这里向上传播并返回到上面的语句。
|
gcd(10, 0) ------------------ 输出: 这是基本情况,返回 10。


gcd(4,5)-------------------- output: 最后这里返回1.
|
gcd(5, 4)-------------------- output: 与下面相同,1 传播回执行链
|
gcd(4, 1)-------------------- output: 由于输出没有发生其他任何事情,因此 1 在这里向上传播并返回到上面的语句。
|
gcd(1, 0)--------------------输出: 这是基本情况,其中返回 1。


gcd(8,12)-------------------- 输出: 最后这里返回4.
|
gcd(12, 8)-------------------- output: 与下面相同,4 传播回执行链
|
gcd(8, 4)-------------------- output: 由于输出没有发生其他任何事情,因此 4 在这里向上传播并返回到上面的语句。
|
gcd(4, 0)--------------------输出: 这是基本情况,返回 4。


运行通过这样的例子帮助我理解了递归递归关系,它呈现了递归方法的本质。

注意:对于树上可怕的格式感到抱歉。我不是 SO 专家,也不知道如何让这些 "trees" 看起来更好。

此特定示例使用 Euclidean algorithm。它指出,您可以通过取第二个数字并将其作为第一个数字并取 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 和 return a=2 的基本情况。

我真的不明白你所说的简化案例是什么意思,但让我试着解释一下那里发生了什么。 您的基本情况是:
如果(b==0) return一个;

一般来说,当我们谈论递归时,我们需要做的第一件事就是找到基本情况。 好吧,一个数字和一个 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. 当它到达第三次递归时,它命中基数 class 和 returns 5.

我们可以将基本情况设为 如果(a==0||b==0) return a+b;

所以当你说 return gcd(a,b) 时,该方法会再次启动并执行它的工作,直到它 return 很长。

嗨。 谢谢