Python
Задача на питоне
Даны два целых числа A>0 и B>0 , найти наибольший общий делитель.
Вот я ввёл два числа в алгоритм, приведённый выше, а мне говорят:
Почему так? Потому что не надо делать рекурсию, когда она не нужна. Реализация с циклом и пишется короче, и отрабатывает быстрее, и не падает по переполнению стека:
Traceback (most recent call last):
File "/home/main.py", line 113, in
print("НОД(", a, ",", b, ") =", gcd(a, b))
File "/home/main.py", line 108, in gcd
return gcd(b, a % b)
File "/home/main.py", line 108, in gcd
return gcd(b, a % b)
File "/home/main.py", line 108, in gcd
return gcd(b, a % b)
[Previous line repeated 995 more times]
File "/home/main.py", line 106, in gcd
if b == 0:
RecursionError: maximum recursion depth exceeded in comparison
Числа были такие: a = 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
b = 26863810024485359386146727202142923967616609318986952340123175997617981700247881689338369654483356564191827856161443356312976673642210350324634850410377680367334151172899169723197082763985615764450078474174626
При том, что библиотечная функция math.gcd на них отрабатывает нормально, gcd = 1.Почему так? Потому что не надо делать рекурсию, когда она не нужна. Реализация с циклом и пишется короче, и отрабатывает быстрее, и не падает по переполнению стека:
def gcd(a, b):
while b != 0: a, b = b, a % b
return a
И вся обычная кухня с вводом-выводом чиселок: a = 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
b = 26863810024485359386146727202142923967616609318986952340123175997617981700247881689338369654483356564191827856161443356312976673642210350324634850410377680367334151172899169723197082763985615764450078474174626
print("НОД(", a, ",", b, ") =", gcd(a, b))
from math import gcd
A, B = map(int, input('A B: ').split())
print(gcd(A, B))
A, B = map(int, input('A B: ').split())
print(gcd(A, B))
Для нахождения наибольшего общего делителя (НОД) двух целых чисел можно использовать алгоритм Евклида. Алгоритм заключается в том, что из большего числа вычитается меньшее до тех пор, пока они не станут равными. Затем полученное число (которое равно искомому НОД) ищется рекурсивно для двух меньших чисел. Процесс продолжается до тех пор, пока одно из чисел не станет равным нулю.
Пример кода на Python:
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
# пример использования функции
a = 24
b = 16
print("НОД(", a, ",", b, ") =", gcd(a, b))
В этом примере функция "gcd" рекурсивно находит наибольший общий делитель для двух чисел "a" и "b". Если второе число равно нулю, то функция возвращает первое число. В противном случае, функция вызывает саму себя с аргументами "b" и остатком от деления "a" на "b".
В конце примера функция "gcd" вызывается с аргументами 24 и 16, и на экран выводится значение НОД, равное 8.
Пример кода на Python:
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
# пример использования функции
a = 24
b = 16
print("НОД(", a, ",", b, ") =", gcd(a, b))
В этом примере функция "gcd" рекурсивно находит наибольший общий делитель для двух чисел "a" и "b". Если второе число равно нулю, то функция возвращает первое число. В противном случае, функция вызывает саму себя с аргументами "b" и остатком от деления "a" на "b".
В конце примера функция "gcd" вызывается с аргументами 24 и 16, и на экран выводится значение НОД, равное 8.
Bulat Painter
Не работает на моих данных.
Traceback (most recent call last):
File "/home/main.py", line 113, in
print("НОД(", a, ",", b, ") =", gcd(a, b))
File "/home/main.py", line 108, in gcd
return gcd(b, a % b)
File "/home/main.py", line 108, in gcd
return gcd(b, a % b)
File "/home/main.py", line 108, in gcd
return gcd(b, a % b)
[Previous line repeated 995 more times]
File "/home/main.py", line 106, in gcd
if b == 0:
RecursionError: maximum recursion depth exceeded in comparison
Похожие вопросы
- Решить две задачи на питоне. Помогите пожалуйста
- Задача по питону для начинающих
- нужно написать задачи на питоне
- Задача в питоне!!!!!! Дано целое число n (n находится в диапазоне от 1 до 99), определяющее возраст человека в годах.
- Помогите с 3 задачами на питон 3!!! пожалуйста!!
- Задача "Шашки", питон
- Помогите решить задачу на питон!!
- Помогите решить задачу в питоне, пожалуйста.
- Помогите решить задачу на питоне. пожалуйста.
- Помогите, пожалуйста, с задачей на питоне!
С рекурсивной функцией реализации метода Евклида чтобы программа работала без ошибок лучше её сделать так: Но я что-то тоже почему-то не думаю, что рекурсия здесь - лучшее решение. По-моему с итерационным циклом while всё таки лучше...