Другие языки программирования и технологии

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

допустим, есть int i{0}

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

return i;
}

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

И как сделать, чтобы вернулось значение именно функции 3?
переменная 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))))));
Александр
Александр
17 648
Лучший ответ
откуда-то вызывается функция 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; }
Вячеслав Хегай
Вячеслав Хегай
70 793
Хорошее объяснение рекурсии в этом видео https://youtu.be/0Bc8zLURY-c
Там язык Питон, но это не важно. Примеры кода можно не смотреть, и смысл понятен и без знания Питон.
Тут важно правильно рассуждать. Тогда не надо думать про "функцию 1", "функцию 2", "функцию 3". Это лишняя сложность.
Евгений Сорокин Хватит себя рекламировать
Валерий Исаков да, знаю, что это одна функция. Наверное, в моем примере неудачно использованы номера для показа порядка. Спасибо за видео.
всё верно описано.
Если тебе нужно вернуть результат самой глубокой функции, то это должна сделать каждая функция.

int rec(int i)
{
i++;
if (i<3)
return rec(i); // рекурсия, вызываем следующий уровень, возвращаем результат

return 333; // мы досигли дна, возвращаем значение 333
}
Ражаб Балхин
Ражаб Балхин
15 498
Там библиотеки, рассписывать не буду
------
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
из нижней функции возвращается управление в верхнюю, и в которую вернулись, выполняется следующая по счету команда