Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 08.07.2017
Сообщений: 54

Объясните, как работает рекурсия в коде, по нахождению НОД

02.08.2017, 12:44. Показов 1033. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int nod(int x, int y)
{
   if(x == 0)
      return y;
   else if(y == 0)
      return x;
   else if(x == y)
      return x;
   else if(x == 1 || y == 1)
      return 1;
   else if(x % 2 == 0 && y % 2 == 0)
      return 2 * nod(x / 2, y / 2) //1 рекурсия
   else if(x % 2 == 0 && y % 2 != 0)
      return nod(x / 2, y); //2 рекурсия
   else if(x % 2 != 0 && y % 2 == 0)
      return nod(x, y / 2); //3 рекурсия
   else if(x % 2 != 0 && y % 2 != 0)
      return nod(y, abs(y - x)); //4 рекурсия
}
Можете подробнее разжевать по какому принципу работают эти 4 рекурсии?
Ну то есть, я не пойму где они останавливаются, и как начинаются.
Допустим вызываем первую (x = 18; y = 48): 2 * nod (18/2;48/2) - > 2 * nod (9/2;24/2) -> 2 * nod (и тут кстати не понятно 5 или 4/2;12/2) - > 2 * nod (2/2; 6/2) -> 2 * nod (1;3) И что дальше? По условию else if(x == 1 || y == 1) мы возвращаем 1. Но я не пойму в хили у. И продолжается ли рекурсия дальше, делим ли мы 3 на два, или х и у нас становятся 1? Или 1 возвращается только у х, а рекурсия продолжается, пока y не достигнет 0 или 1? Короче, ничего не понятно.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2017, 12:44
Ответы с готовыми решениями:

Программа по нахождению нод и нок с помощью алгоритма Евклида. Почему то не работает
Программа по нахождению нод и нок с помощью алгоритма Евклида. Почему то не работает, не могу разобраться. Только НОД работал, а когда...

Объясните как работает рекурсия
#include <iostream> #include <iomanip> using namespace std; void print(int a, int b); int main() { print(0,...

Объясните, как здесь работает рекурсия
Объясните как работает рекурсивный метод в данном коде class BWDemo { /** * @param args */ public static void...

2
 Аватар для Nishen
1359 / 857 / 366
Регистрация: 26.02.2015
Сообщений: 3,824
02.08.2017, 12:54
Мы возвращаем единицу не в x, и не в y. Мы возвращаем результат в то место, откуда был произведен вызов функции.
Нет, не продолжается, когда достигается условие
C++
1
if(x == 1 || y == 1)
происходит передача значения в точку вызова и будет происходить столько раз, сколько раз происходил рекурсивный вызов.
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
02.08.2017, 12:56
Цитата Сообщение от Jagario Посмотреть сообщение
Но я не пойму в хили у
в условии же написано что как только x или y буду равны 0
Цитата Сообщение от Jagario Посмотреть сообщение
И продолжается ли рекурсия дальше
если условие выполнилось - нет, и мы переходим к следующей итерации или же на выход из ф-и
Цитата Сообщение от Jagario Посмотреть сообщение
делим ли мы 3 на два
ну смотрите по условию , все же написано, если число делится нацело, тогда делим
C++
1
2
3
4
5
6
7
8
9
10
11
12
//пример
 recursion(int n) 
    {
        // условие выхода
        // Базовый случай
        // когда остановиться повторять рекурсию ?
        if (n == 1) {
            return 1;
        }
        // Шаг рекурсии / рекурсивное условие
        return recursion(n - 1) * n;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2017, 12:56
Помогаю со студенческими работами здесь

Объясните, как работает простая рекурсия
функция луковица, можете пожалуйста объяснить на словах как тут работает рекурсия. (defun onion (w) (if (cdr w) (list (car w)...

Рекурсия: Объясните как работает функция получения НОДа
static int NOD(int a, int b) { if (b == 0) { return a; } ...

Ряд Фибоначчи. Объясните как можно популярнее как работает рекурсия
По возможности максимально подробно расскажите про рекурсию public int Fibonacci(int n) { if (n <= 2) { ...

Задача по нахождению НОК , НОД
Всем привет ребят. Мне нужна ваша помощь, я написал коды для нахождения НОК, НОД и программу для разложения чисел на простые множители для...

Объясните каким образом работает программа,чем в данном коде является pos
Объясните каким образом работает программа,чем в данном коде является pos. ___ var s: string; begin s := 'rabrakadabravddfa'; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru