我想更好地理解递归。如果我正确理解这一点,递归适用于您的基本案例和原始案例的简单版本。所以通常人们会看到代码从参数中减去一个。但是,我看到了以下代码,如果没有简化案例,我就无法理解它是如何工作的。任何解释都会有所帮助。
public static long gcd(long a, long b) {
if (b==0)
return a;
else
return gcd(b, a % b);
}
答案 0 :(得分:2)
使用一些示例
来理解递归以构建递归树的最简单方法 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专家,也不知道如何制作这些"树"看起来更好。
答案 1 :(得分:1)
此特定示例使用Euclidean algorithm。它声明你可以通过获取第二个数字并将其作为第一个数字来获得值的gcd,并使用a / b的余数来获得第二个数字。您继续这样做,直到第二个数字达到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
。
答案 2 :(得分:0)
我真的不明白你简化案件是什么意思,但让我试着解释一下那里发生了什么。
你的基础案例是:
if(b == 0)
返回a;
一般来说,当我们谈论递归时,我们首先需要做的是找到基本情况。 好吧,一个数字和一个0的gcd总是数字(我们的基本情况)。
接下来我们需要说出%的作用。 5%10 = 5和10%5 = 0。让我们举一个例子吧。 GCD(5,10)
我们可以将基本情况作为 如果(A == 0 || b == 0) 返回a + b;
所以当你说返回gcd(a,b)时,该方法会再次启动并完成它的工作,直到它返回一个long。
HIH。 感谢