Я просто нашел этот алгоритм для вычисления наибольшего общего делителя в своих лекциях:
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, но это ускользает от меня. Помогите пожалуйста?