Другие языки программирования и технологии

Нахождение наибольшего общего делителя НОД.

чет я смотрю на алгоритм и понять не могу. Реализация рекурсивным способом...
int NOD(int n1, int n2)
{
int div;
if (n1 == n2) { return n1; }
int d = n1 - n2;
if (d < 0) { d = -d; div = NOD(n1, d); }
else { div = NOD(n2, d); }
return div;
}

Предположим есть число 4 и 7, общий делитель который = 1.
Согласно этой формуле и меня получается бесконечная рекурсия...
4-7=-3=>3 Передаем 4 и 3
4-3=1 передаем 7 и 1
7-1=6 передаем 7 и 6
7-6 = 1 передаем 7 и 1
7-1 = 6 передаем 7 и 6 и т. д.

Что я упускаю то блеать?
Рекурсивно вычитанием??? У тебя стек быстрее закончится.
С помощью последовательных вычитаний находят остаток от деления. Что намного проще сделать операцией взятия остатка.

Рекурсивный вариант записывается в одну строчку:

int nod(int a, int b) { return b == 0? a : nod(b, a % b); }

Ты на каждом шаге вычитаешь из большего числа меньшее и передаёшь в в следующий вызов меньшее из чисел и разность. Только написано у тебя это очень криво.

int nod(int n1, int n2) {
if (n1 == n2) { return n1; }
if (n1 < n2) { return nod(n1, n2 - n1); }
if (n1 > n2) { return nod(n2, n1 - n2); }
}

7 - 4 = 3 => nod(4, 3)
4 - 3 = 1 => nod(3, 1)
3 - 1 = 2 => nod(2, 1)
2 - 1 = 1 => nod(1, 1)
FB
Frol Borisov
62 330
Лучший ответ
Исломжон Хайдаров если b == 0 общий не может быть a. ведь там будет деление на ноль по сути... почему не a==b

и я все равно не понимаю... у меня на бумаге зацикливается все... и это бесконечная рекурсия должна быть с числами 4 и 7....где то я туплююю
Исломжон Хайдаров Спс, проанализирую позже))) Ваш вариант на остатках разве будет быстрее чем на вычитаниях? но то что короче это однозначно +)))
static int GetNOD (int val1, int val2)
{
while ((val1 !=0) && (val2 != 0))
{
if (val1> val2)
val1 -= val2;
else
val2 -= val1;
}

return Math.Max(val1, val2);
}
ЖБ
Женя Б
65 111
Исломжон Хайдаров теперь понятно... блеать. ну да. спасибо
На моём YouTube канале мною подробно разъяснены коды на C++, включая 3 урока про НОД / НОК, в частности рекурсивным методом.
Если хочешь - смотри.
https://www.youtube.com/playlist?list=PLVFACQZJxOLhZrRfpMqhwFo9nJUAU2xpw
ShowCode C++ Сокращение дроби НОД методом сокращения чисел по простым множителям.
ShowCode C++ НОД по Евклиду Непричёсанный алгоритм
ShowCode C++ НОД по Стайну 1967 Спец. алгоритм разработанный Станом и оптимизирован специально для ЭВМ. Его эффективность достигается использованием побитовых смещений вместо долгой операции деления.
ShowCode C++ Компактный и быстрый поиск НОД и НОК НОД рекурсивно в одну строку.
РП
Роберт Пинн
8 552
Исломжон Хайдаров титры в конце нужны))))
хз

Похожие вопросы