Я не уверен, что точно понимаю, что вы ищете, но давайте рассмотрим следующий модифицированный код:
def simple_linear_diophantine_r(a, b):
q, r = divmod(a, b)
if r == 0:
return (0, b)
else:
x, y = simple_linear_diophantine_r(b, r)
return (y, x - q * y)
a, b = 43, 486
x, y = simple_linear_diophantine_r(a, b)
print(f'({a}) * ({x}) + ({b}) * ({y}) == {a * x + b * y}')
# (43) * (-113) + (486) * (10) == 1
, который работает, как и ожидалось. По сравнению с исходным кодом я переписал математику таким образом, что используются только int
-защищенные операции (без разделения float
). Кроме того, я переименовал саму функцию и некоторые внутренние переменные.
Пока это более или менее то, что вы уже знали.
Теперь, один способ понять, что происходит, это использовать отладчик Python .
Более простой для иллюстрации подход заключается в размещении вызовов print()
в Strategi c местах:
def simple_linear_diophantine_r(a, b):
q, r = divmod(a, b)
print(f'a={a}, b={b}, q={q}, r={r}') # DEBUG
if r == 0:
return (0, b)
else:
x, y = simple_linear_diophantine_r(b, r)
print(f'x={x}, y={y}') # DEBUG
return (y, x - q * y)
a, b = 43, 486
x, y = simple_linear_diophantine_r(a, b)
print(f'({a}) * ({x}) + ({b}) * ({y}) == {a * x + b * y}')
вывод которого теперь:
a=43, b=486, q=0, r=43
a=486, b=43, q=11, r=13
a=43, b=13, q=3, r=4
a=13, b=4, q=3, r=1
a=4, b=1, q=4, r=0
x=0, y=1
x=1, y=-3
x=-3, y=10
x=10, y=-113
(43) * (-113) + (486) * (10) == 1
, и теперь вы можете более легко следить за тем, что происходит при каждом вызове функции.