我刚刚在我的讲义中发现了这个算法来计算最大公约数:
public static int gcd( int a, int b ) {
while (b != 0) {
final int r = a % b;
a = b;
b = r;
}
return a;
}
所以r是将b除为a时的余数(获取 mod)。然后将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,但这让我望而却步。请帮忙?