Алгоритм Евклида — это классический метод для нахождения наибольшего общего делителя (НОД) двух чисел. Модифицированный алгоритм Евклида, который иногда называют методом вычитания, использует операции вычитания вместо деления. Однако, в контексте вычислительной эффективности, алгоритм, использующий операции деления, предпочтительнее.
Я предоставлю обе версии: рекурсивную и нерекурсивную (итеративную) реализации стандартного алгоритма Евклида, который использует операцию деления, так как это наиболее часто используемый и эффективный подход.
Рекурсивная версия
Рекурсивная версия алгоритма Евклида основана на следующем свойстве: НОД двух чисел a
и b
равен НОД меньшего числа b
и остатка от деления a
на b
. Рекурсия продолжается до тех пор, пока одно из чисел не станет равным нулю. В этот момент другое число будет являться НОД.
def gcd_recursive(a, b):
if b == 0:
return a
else:
return gcd_recursive(b, a % b)
Нерекурсивная (итеративная) версия
Итеративная версия алгоритма Евклида реализуется с помощью цикла, который продолжает работать до тех пор, пока одно из чисел не станет нулем. На каждом шаге происходит обновление значений a
и b
.
def gcd_iterative(a, b):
while b != 0:
a, b = b, a % b
return a
Пример работы
Рассмотрим пример нахождения НОД для чисел 48 и 18:
Рекурсивный подход:
gcd_recursive(48, 18)
вызывает gcd_recursive(18, 48 % 18)
→ gcd_recursive(18, 12)
gcd_recursive(18, 12)
вызывает gcd_recursive(12, 18 % 12)
→ gcd_recursive(12, 6)
gcd_recursive(12, 6)
вызывает gcd_recursive(6, 12 % 6)
→ gcd_recursive(6, 0)
gcd_recursive(6, 0)
возвращает 6.
Итеративный подход:
- Начальное состояние:
a = 48
, b = 18
- Первое обновление:
a = 18
, b = 48 % 18 = 12
- Второе обновление:
a = 12
, b = 18 % 12 = 6
- Третье обновление:
a = 6
, b = 12 % 6 = 0
- Завершение цикла, результат:
a = 6
.
Обе функции возвращают НОД, равный 6. Эти алгоритмы эффективны и просты в реализации, и их можно легко адаптировать для использования в различных языках программирования.