#python #recursion
#python #рекурсия
Вопрос:
Я начинающий ученик и уже некоторое время просматриваю этот код на PythonTutor, и я получаю правильное значение для ‘final’ за 27 шагов, но, похоже, не могу понять, как заставить цикл while прекратить выполнение и вычисление остатков. Как я могу получить возврат из цикла if, чтобы он стал конечным результатом программы? В данном случае мы используем алгоритм Евклида для вычисления.
def gcdRecur(a, b):
'''
a, b: positive integers
returns: a positive integer, the greatest common divisor of a amp; b.
'''
final=''
high=max(a,b)
result=min(a,b)
while high%result>0:
result-=1
return result*gcdRecur(b,(a%b))
if high%result==0:
final=result
return final
a=1071
b=462
final_ans=gcdRecur(a,b)
print(final_ans)
Комментарии:
1. Разве это не должно быть просто
return gcdRecur(b,(a%b))
?2. зачем размещать
()
вокруг(a%b)
? Какая пользаwhile
, это простоif
замаскированный3. Кроме того, вы можете просто использовать
if
вместоwhile
, и должны использовать значения min и max вместо originala
иb
в рекурсивном вызове.
Ответ №1:
Я думаю, что ваши провода пересеклись по Евклиду. Если вы настаиваете на том, чтобы входные данные были целыми положительными числами (т. Е. Не 0 и не отрицательными), вы можете использовать алгоритм Евклида на основе вычитания:
def gcdRecur(a, b):
'''
a, b: positive integers
returns: a positive integer, the greatest common divisor of a amp; b.
'''
if a == b:
return a
if a > b:
a -= b
else:
b -= a
return gcdRecur(a, b)
и избегайте min()
, max()
и modulus ( %
) . Если вы используете модульный вариант алгоритма Евклида, то вам не требуется столь жестких ограничений на входные значения, и это может быть выражено рекурсивно как просто:
def gcdRecur(a, b):
return a if not b else gcdRecur(b, a % b)