我在我的讲义笔记中找到了一个计算最大公约数的算法:
public static int gcd( int a, int b ) {
while (b != 0) {
final int r = a % b;
a = b;
b = r;
}
return a;
}
所以r是将a除以b所得余数(获取模数)。然后将b赋值给a,并将余数赋值给b,最后返回a。我一直都不明白这个算法是如何工作的!
而且,显然这个算法并不适用于所有情况,必须使用以下算法:
public static int gcd( int a, int b ) {
final int gcd;
if (b != 0) {
final int q = a / b;
final int r = a % b; // a == r + q * b AND r == a - q * b.
gcd = gcd( b, r );
} else {
gcd = a;
}
return gcd;
}
我不理解这背后的原因。我通常能理解递归并且擅长Java,但是这个问题困扰着我。请帮我一下?