Напишите функцию gcd, которая вычисляет наибольший общий делитель последовательности чисел.
Параметрами функции выступают натуральные числа в произвольном количестве, но не менее одного.
Примечание
Ваше решение должно содержать только функции.
В решении не должно быть вызовов требуемых функций.
Пример
Ввод
result = gcd(3)Вывод
result = 3Ввод
result = gcd(36, 48, 156, 100500)Вывод
result = 12Решение
Развитие задач B. Функциональный НОД и F. НОД 2.0.
Фактически нам надо «скрестить» первую задачу со второй. Цель задачи — научить работать с переменным количеством входных данных с с помощью конструкции *args.
Посмотреть код
Решение
Python
# типовое решение
def gcd(*args):
a = list(args)
while len(a) > 1:
while a[-1]:
a[0], a[-1] = a[-1], a[0] % a[-1]
a.pop()
return a[0]Решение
Python
# типовое решение
def gcd(*numbers):
result = numbers[0]
for x in numbers[1:]:
while x:
result, x = x, result % x
return result
Решение
Python
# лаконичное решение
def gcd(*numbers):
a, *tail = numbers
for b in tail:
while b:
a, b = b, a % b
return a
Почему тесты выдают ошибку этому коду? Вроде, логика верна и ошибок в написании нет. Гуглил, спросил у нейросети, но не смог найти ответа.
from functools import reduce def gcd(*numbers): def gcd_2_args(a, b): while b: a, b = b, a % b return a return reduce(gcd_2_args, numbers)Я думаю, что ему не нравится вызовы reduce и gcd_2_args
Если избавиться от первого и второго, то все работает.
Имеет смысл держать в голове, что создатели этого хендбука чаще всего хотят вас научить чему-то последовательно, а вы вроде как соглашаетесь научиться. В этом смысле приходить с reduce в задачки, которые легко решаются без него может быть не совсем оправданно. Если хотчется именно такие решения, то лучше учиться на codewars. Там за редким исключением нет ограничений на решения. Навскидку, разве что, могут попросить не портить входные данные.