C++ подскажите наглядно про стек и рекурсии - Вопросы по С+

Вопрос C++ подскажите наглядно про стек и рекурсии

Регистрация
22 Ноя 2013
Сообщения
102
Репутация
0
Спасибо
0
Монет
0
допустим, есть int i{0}

int rec(int i)
{
i++;
if (i<3)
rec(i);

return i;
}

как это происходит:
функция 1
..функция 2
....функция 3
а потом функция 3 возвращается к функции 2, завершает ее
затем функция 2 к функции 1, завершает ее?
Правильно я понимаю?
Если нет, объясните нубу попроще.

И как сделать, чтобы вернулось значение именно функции 3?
 
Регистрация
1 Сен 2013
Сообщения
77
Репутация
0
Спасибо
0
Монет
0
всё верно описано. Если тебе нужно вернуть результат самой глубокой функции, то это должна сделать каждая функция. int rec(int i) { i++; if (i<3) return rec(i); // рекурсия, вызываем следующий уровень, возвращаем результат return 333; // мы досигли дна, возвращаем значение 333 }
 
Регистрация
17 Сен 2013
Сообщения
102
Репутация
0
Спасибо
0
Монет
0
из нижней функции возвращается управление в верхнюю, и в которую вернулись, выполняется следующая по счету команда
 
Регистрация
13 Дек 2013
Сообщения
72
Репутация
0
Спасибо
0
Монет
0
откуда-то вызывается функция 1 функция 1 вызывает функицю 2 функция 2 вызывает функцию 3 функция 3 завершается и продолжается выполнение функции 2 функция 2 завершается и продолжается выполнение функции 1 функция 1 завершается и продолжается выполнение того кода, из которого была вызвана функция 1. int rec(int i) { i++; if (i<3) return rec(i); return i; } А можно и в одну строчку: int rec(int i) { return ++i < 3? rec(i) : i; }
 
Регистрация
10 Авг 2013
Сообщения
82
Репутация
-2
Спасибо
0
Монет
0
переменная i копируется так как ссылки на нее нигде нет ваще при рекурсии есть один чит, не i++ делать а вызвать сразу rec(++i) или rec(i+1) все переменные каждой итерации будут сидеть в памяти и например если ты считает факториал то круто делать так int rec(int i) { if (i==1) return 1; else return i*rec(i-1); } тоесть надо писать всегда 2 ветви: рекурсию и точку выхода как ты и сделал собсна а в моем примере получится вывод типа return i*(..*(5*(4*(3*(2*(1))))));
 

juy

Capitan

juy

Capitan
Регистрация
3 Ноя 2013
Сообщения
70
Репутация
0
Спасибо
0
Монет
0
Там библиотеки, рассписывать не буду ------ int plus() { int i = rec ( int i) // Вызываем функцию 3 return i; // Результат возвращаем 1 } int rec (int i) //Функция 3 { // что-то выполняется c переменной i return i; //Возвращаем второй } int main() // Функция 1 { int y = i(); // Вызываем функцию 2 return 0; } Здесь Функция 1 переходи в 2, вторая вызывает третью третью Можно делать глобальные переменные, но они не слишком то нужны. Лучше так 1 --> 2 --> 3 --> 2 --> 1 С глобальными (глобальная переменная g_x) (тут можно использовать void) 1(вместе с переменной g_x) --> 2 --> 3 --> g_x
 
Сверху Снизу