Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2012, 21:54   #1
Max11111
Новичок
Джуниор
 
Регистрация: 21.12.2012
Сообщений: 4
По умолчанию Что вернет функция?

Задача на нахождение НОДа. Столкнулся с данным кодом. Не могу понять, как работают строки (4 последних else if) . А именно, как работает оператор return в данном случае, насколько я знаю, он возвращает только один аргумент.
Обучаюсь сам, ковыряю коды пока не "прочувствую" их. Кому не трудно - помогите пожалуйста. Спасибо.

Код:
#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));
}

Последний раз редактировалось ACE Valery; 21.12.2012 в 22:52.
Max11111 вне форума Ответить с цитированием
Старый 21.12.2012, 22:15   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

А он и возвращает один аргумент. Только этот аргумент вычисляется непосредственно переде выполнением ретурна. Т.е, в качестве аргумента, выступает выражение.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 21.12.2012, 22:25   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Есть еще такая веселая конструкция:
return nod(x, y / 2) , nod(x / 2, y);
Вычислятся обе функции, вернется результат последней.
EUGY вне форума Ответить с цитированием
Старый 21.12.2012, 22:42   #4
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Есть еще такая веселая конструкция:
return nod(x, y / 2) , nod(x / 2, y);
Вычислятся обе функции, вернется результат последней.
надо попробовать
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 21.12.2012, 23:01   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Язык богат на чудеса.
Код:
int func1()
{
	return 666;
}

void  func2()
{
	return void(func1());
}
EUGY вне форума Ответить с цитированием
Старый 21.12.2012, 23:27   #6
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

У void'а есть конструктор от int'а? Забавно, очень забавно.

Раз уж такая пьянка, древнейший боян:
Код:
int a[6] = {1, 4, 9, 16, 25, 36};
for (int i = 0; i < 6; ++i)
  std::cout << (i + 1) << "^2 = " << i[a];
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 22.12.2012, 01:39   #7
Max11111
Новичок
Джуниор
 
Регистрация: 21.12.2012
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
А он и возвращает один аргумент. Только этот аргумент вычисляется непосредственно переде выполнением ретурна. Т.е, в качестве аргумента, выступает выражение.
Благодарю за ответ. Если не тяжело, объясните пожалуйста более подробно, если можно. А вот к примеру Х=15, Y=16. Попадаем мы в кусок кода "else if(x % 2 != 0 && y % 2 == 0) return nod(x, y / 2);" каким образом оно вычислит нам НОД - единицу?
В последнем else if return nod(y, abs(y - x)) если числа будут 3 и 11, то показывает тоже единицу. Функцией abc мы вычисляем модуль числа. Т.е. по моей логике ( не правильной логике ) должно показать число 8.


Я вообще думал что в этом коде есть ошибки, но работает все нормально.
Дней 5 параллельно пытаюсь понять этот кусок кода (4 последних else if), и никак не могу осилить его.


Цитата:
Сообщение от EUGY Посмотреть сообщение
Есть еще такая веселая конструкция:
return nod(x, y / 2) , nod(x / 2, y);
Вычислятся обе функции, вернется результат последней.
Благодарю, запомню :-)

Последний раз редактировалось Max11111; 22.12.2012 в 01:41.
Max11111 вне форума Ответить с цитированием
Старый 22.12.2012, 03:43   #8
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

О, тут про пьянки)

Вот, недавно втыкал:
Код:
wchar_t wc[100] = {0};
wchar_t *wv = L"sample string";
wcscat_s(wc + 20, 100, wv);
Чему равно wc[80] ?
_________________


А насчет рекурсии, то попробуйте вместо "возвращает" говорить "вызывает". "Возвращает" корректнее, но "вызывает" - понятнее.

I.e. функция с аргументами nod( 15, 16), вызывает nod(15,8), которая вызывает nod(15,4), которая вызывает nod(15,2), которая вызывает nod(15,1), и вот которая уже возвращает 1.

Последний раз редактировалось Smogg; 22.12.2012 в 04:15.
Smogg вне форума Ответить с цитированием
Старый 22.12.2012, 04:16   #9
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Чему равно wc[50] ?
wc полон \0
так что там будет 0.)

Код:
for(int i=0,d=7; i<8,d>=0;i++,d--)
помойму так двойной фор фигачат =)
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 22.12.2012, 04:47   #10
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Про двойные форы
Код:
    int a[m][n];
    for (int i = 0, j = 0; i < m && j < n; j++, ((j == n) ? j = 0, i++ : 0))
        std::cout << i << ", " << j << std::endl;
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что за функция. Predator199 PHP 6 22.10.2012 18:40
Что за функция? X_RaY Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 11.09.2011 16:55
Что выполняет функция? KingBelt Общие вопросы C/C++ 5 29.11.2010 09:06
Что за функция TimeGetTime??? dolphin705 Общие вопросы Delphi 3 25.01.2010 19:14
что делает функция length() ??? Paul_AG Общие вопросы C/C++ 4 11.05.2009 00:07