Python

Помогите решить задачу. python

есть формула, но она не работает. Подскажите, где поменять в формуле данные, чтобы моя формула сработала? Мне важно понять, что именно с этой формулой не так. спасибо

Даны два натуральных числа A и B. Требуется найти их наибольший общий делитель.
Примечание. В программе запрещается использовать циклы.

a = 42
b = 12

def find_f(a, b):

if a!=0 and b!=0:
if a > b:
a = a % b
else:
b = b % a

find_f(a, b)

return a,b

print('Результат формулы:', find_f(a, b))
Олег Дук
Олег Дук
226
Вот это - и есть ошибка:
 find_f(a, b)
return a,b
Значение от вложенного вызова find_f выбрасывается, а вместо этого возвращаются значения переданных туда параметров. А должно быть так:
 return a if not b else b if not a else find_f(a, b) 
(не забываем об условии окончания рекурсии)

А можно через свёртку и тоже без циклов:
 from itertools import accumulate as ac, repeat as rp, takewhile as tw
from operator import itemgetter as ig

def gcdstep(t, _):
a, b = t
return (b, a % b)

def find_gcd(a, b):
*_, (_, g) = tw(ig(1), ac(rp(0), gcdstep, initial = sorted((a, b), reverse = True)))
return g

print(find_gcd(*map(int, map(input, ('',) * 2))))

Конечно, внутри, "под капотом", циклы есть, но это можно и о print сказать, а print же использовать не запрещено.
ДА
Данияр Абикеев
54 053
Лучший ответ
Олег Дук спасибо огромное!
 def find_f(a, b): 
if a and b:
return find_f(a % b, b) if a > b else find_f(a, b % a)
return a, b

print('Результат формулы:', find_f(a, b))
Medet Баекенов
Medet Баекенов
76 413
 a = 42 
b = 12

def find_gcd(a, b):
if b == 0:
return a
return find_gcd(b, a % b)

gcd = find_gcd(a, b)
print("Наибольший общий делитель:", gcd)
В вашем коде ошибки:
Отсутствие отступов: В Python отступы имеют значение и определяют блоки кода. Вам нужно добавить отступы для определения тела функции find_f.

Отсутствие базового случая для рекурсии: В вашей функции find_f отсутствует базовый случай, который указывает на окончание рекурсии. Без базового случая функция будет рекурсивно вызывать саму себя бесконечно.

Неправильный порядок обновления переменных a и b: При использовании алгоритма Эвклида для нахождения НОД, нужно обновлять значения a и b в правильном порядке. Вы должны присваивать a новое значение a % b, а b новое значение b % a.
Олег Дук спасибо за ответ.
Но мне бы именно по своей формуле понять, почему она не отрабатывает корректно.
Отступы загружаю, но сайт их обратно выравнивает по левому краю