допустим, есть int i{0}
int rec(int i)
{
i++;
if (i<3)
rec(i);
return i;
}
как это происходит:
функция 1
..функция 2
....функция 3
а потом функция 3 возвращается к функции 2, завершает ее
затем функция 2 к функции 1, завершает ее?
Правильно я понимаю?
Если нет, объясните нубу попроще.
И как сделать, чтобы вернулось значение именно функции 3?
Другие языки программирования и технологии
C++ подскажите наглядно про стек и рекурсии
переменная 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))))));
ваще при рекурсии есть один чит, не 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))))));
откуда-то вызывается функция 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; }
функция 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; }
Хорошее объяснение рекурсии в этом видео https://youtu.be/0Bc8zLURY-c
Там язык Питон, но это не важно. Примеры кода можно не смотреть, и смысл понятен и без знания Питон.
Тут важно правильно рассуждать. Тогда не надо думать про "функцию 1", "функцию 2", "функцию 3". Это лишняя сложность.
Там язык Питон, но это не важно. Примеры кода можно не смотреть, и смысл понятен и без знания Питон.
Тут важно правильно рассуждать. Тогда не надо думать про "функцию 1", "функцию 2", "функцию 3". Это лишняя сложность.
Евгений Сорокин
Хватит себя рекламировать
Валерий Исаков
да, знаю, что это одна функция. Наверное, в моем примере неудачно использованы номера для показа порядка. Спасибо за видео.
всё верно описано.
Если тебе нужно вернуть результат самой глубокой функции, то это должна сделать каждая функция.
int rec(int i)
{
i++;
if (i<3)
return rec(i); // рекурсия, вызываем следующий уровень, возвращаем результат
return 333; // мы досигли дна, возвращаем значение 333
}
Если тебе нужно вернуть результат самой глубокой функции, то это должна сделать каждая функция.
int rec(int i)
{
i++;
if (i<3)
return rec(i); // рекурсия, вызываем следующий уровень, возвращаем результат
return 333; // мы досигли дна, возвращаем значение 333
}
Там библиотеки, рассписывать не буду
------
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
------
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
из нижней функции возвращается управление в верхнюю, и в которую вернулись, выполняется следующая по счету команда
Похожие вопросы
- Подскажите учебник по C++! Подскажите учебник по С++, с самого нуля. Желательно с примерами и задачками!
- Помогите, пожалуйста! Куда-то девается свободное место с диска C. Подскажите, что с ним еще можно сделать?
- Очень хочется начать работать в C++ подскажите как это сделать?) )
- задание на C++, подскажите путь решения хотя бы
- C++. Подскажите ответ, есть какие нибудь правила инициализации вложенных структур ?
- c# Подскажите что такое массив?
- Требуется выражение C++ подскажите, что не так.
- Только начал изучать c++, подскажите как в программе указать % ?
- Рекурсия, возникли проблемы с изучением рекурсии, не могли бы подсказать книги или видео про обьяснение рекурсии
- Подскажите практическую задачку на углубленное понимание что такое рекурсия?