чет я смотрю на алгоритм и понять не могу. Реализация рекурсивным способом...
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)
С помощью последовательных вычитаний находят остаток от деления. Что намного проще сделать операцией взятия остатка.
Рекурсивный вариант записывается в одну строчку:
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)
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);
}
{
while ((val1 !=0) && (val2 != 0))
{
if (val1> val2)
val1 -= val2;
else
val2 -= val1;
}
return Math.Max(val1, val2);
}
Исломжон Хайдаров
теперь понятно... блеать. ну да. спасибо
На моём YouTube канале мною подробно разъяснены коды на C++, включая 3 урока про НОД / НОК, в частности рекурсивным методом.
Если хочешь - смотри.
https://www.youtube.com/playlist?list=PLVFACQZJxOLhZrRfpMqhwFo9nJUAU2xpw
ShowCode C++ Сокращение дроби НОД методом сокращения чисел по простым множителям.
ShowCode C++ НОД по Евклиду Непричёсанный алгоритм
ShowCode C++ НОД по Стайну 1967 Спец. алгоритм разработанный Станом и оптимизирован специально для ЭВМ. Его эффективность достигается использованием побитовых смещений вместо долгой операции деления.
ShowCode C++ Компактный и быстрый поиск НОД и НОК НОД рекурсивно в одну строку.
Если хочешь - смотри.
https://www.youtube.com/playlist?list=PLVFACQZJxOLhZrRfpMqhwFo9nJUAU2xpw
ShowCode C++ Сокращение дроби НОД методом сокращения чисел по простым множителям.
ShowCode C++ НОД по Евклиду Непричёсанный алгоритм
ShowCode C++ НОД по Стайну 1967 Спец. алгоритм разработанный Станом и оптимизирован специально для ЭВМ. Его эффективность достигается использованием побитовых смещений вместо долгой операции деления.
ShowCode C++ Компактный и быстрый поиск НОД и НОК НОД рекурсивно в одну строку.
Исломжон Хайдаров
титры в конце нужны))))
хз
Похожие вопросы
- Вычислить наибольший общий делитель двух натуральных чисел с++
- С++ Составьте программу определения наибольшего общего делителя двух натуральных чисел .
- Дано два натуральных числа а и б . Написать программу, которая будет находить и распечатывать все общие делители этих чи
- нахождение наибольшего элемента массива через функцию
- алгоритм... по нахождению общих элементов двух массивов
- Алгоритмы в паскале. Народ, напишите плиз алгоритм нахождения НОД и алгоритм выделения цифр числа. Заранее благодарю)
- Будет ли мешать антивирусы Авира и Нод 32?
- как решить через abc pascal задачу "Дано натуральное число n. Получить все простые делители этого числа"
- 196. Составьте программу получения в порядке убывания всех делителей данного числа.
- Влияет ли на загрузку ПК с ОС WinXP нахождение на «Рабочем столе» файлов или папок большого размера?
и я все равно не понимаю... у меня на бумаге зацикливается все... и это бесконечная рекурсия должна быть с числами 4 и 7....где то я туплююю