Форум программистов, компьютерный форум CyberForum.ru

Программа рекурсивного нахождения НОД. Не могу понять. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Наибольшее/наименьшее значение типа http://www.cyberforum.ru/cpp-beginners/thread752189.html
Где то была тема по этому поводу но по ключевым словам которые в заголовке темы найти не удалось, собственно вопрос , где взять наибольшее и наименьшее значения типа
C++ Как правильно организовать чтение и запись файла? Для записи и чтения файла я использую класс CFile. Допустим при открытии диалога происходит чтение файла, и при закрытии его - запись в файл, как-то так: void CMyDlg::OnInitDialog() { CFile file("file.txt", CFile::modeRead); CArchive ar(&file, CArchive::load); CString s; int x; ar >> x; http://www.cyberforum.ru/cpp-beginners/thread752167.html
C++ Создать очередь с приоритетом (Ошибка)
Здравствуйте, Друзья! Стоящая задача (создать очередь с приоритетом) выполнена, но есть ошибка. Друзья, гляньте пожалуйста "свежим взглядом", где она (а она точно есть): #include <iostream> #include <conio.h> using namespace std; class QueuePrior { int MaxLength; int length;
Вычисление функций с использованием их разложения в степенной ряд ощибки исправте пожалуйста C++
Постановка задачи Для х, изменяющегося от a до b (интервал целиком лежит внутри интервала, указанного в третьей колонке) с шагом , вычислить функцию y=f(x), используя ее разложение в степенной ряд (вторая колонка) в двух случаях: а) для заданного количества слагаемых N (величина зависит от свойств степенного ряда, примерное значение N указано в четвёртой колонке); б) для заданной точности э...
C++ Вывод на экран данных в виде таблицы http://www.cyberforum.ru/cpp-beginners/thread752132.html
Помогите сделать нормальный вывод в консоли, чтобы выводило все ровно а не так как на скриншоте! За вывод отвечает функция Show #include <iostream> #include <conio.h> #include<windows.h> #include<iomanip.h> using namespace std;
C++ Информация по темам билетов Всем доброго времени суток. Готовлюсь к сессии, все шло хорошо, но тут увидел несколько билетов которые мне не знакомы и более того, ищу информацию в интернете, после чего путаюсь, может мне кто помочь, может ссылкой, может литературой какой нибудь. 32. Работа с файлами в С, примеры. 33. Работа с файлами в C++, примеры. 34. Бинарные файлы, операции передачи информации. 35. Функции для... подробнее

Показать сообщение отдельно
IvanInanovich
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 113
04.01.2013, 00:16  [ТС]     Программа рекурсивного нахождения НОД. Не могу понять.
Цитата Сообщение от Игорь с++ Посмотреть сообщение
А чё тут объяснять ? вернуть значение этого выражения 2 * nod(x / 2, y / 2)
Обычный алгоритм Евклида на нахождение НОДа - понимаю. Бинарный - нет.
Встретил его на одном сайте. Когда стал разбирать его, не совсем понял его суть. Наверное из-за того, что не имел опыта с рекурсиями. Вот именно на этой строке и застопорился щас. По моей логике 2 умножаем на один аргумент, затем на второй. Но, затем мы аргументы делим на 2, т.е. возвращаем числам прежнее значение. Как тогда мы выйдем из рекурсии?
По разному пробовал... и изменял код и дополнял. Возможно "полез" не туда, после чего окончательно запутался на очевидном. Вот и решил спросить у людей, которые разберются. Больше не у кого.
Спрашивал у знакомого, который учится на айти специальности (почти уже магистр), только понял что мой гуманитарный мозг лучше понимает чем его "айтишный", т.к. человек писал диплом по с++, а не знает даже толком как работает цикл.


Вот полный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <math.h>
 
int nod(int, int);
 
using namespace std;
 
int main()
{
   int int1, int2;
   
   cout << "//Finding of the greatest general divider" << endl << endl;
   cout << "Enter two whole numbers: " << endl;
   cin >> int1 >> int2;
   cout << "NOD: " << nod(int1, int2) << endl;
   
   return 0;
}
 
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);
   else if(x % 2 == 0 && y % 2 != 0)
      return nod(x / 2, y);
   else if(x % 2 != 0 && y % 2 == 0)
      return nod(x, y / 2);
   else if(x % 2 != 0 && y % 2 != 0)
      return nod(y, abs(y - x));
}
 
Текущее время: 19:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru