В рекурсивной функции обязательно должно быть заключительное условие при котором не вызывается она сама (или будет бесконечный цикл).
#include <iostream> // std::cout, std::endl
int fib(int num){ // Вычисляем числа Фибоначи рекурсивно
int res = 1; // Начальная инициализация
if(num > 1){ // При num == 1 Вычисление должно остановиться (num уменьшается при каждом вызове)
res = num * fib(num - 1); // Вызываем рекурсивно себя
}
std::cout << "num = " << num << ", res = " << res << std::endl; // Выводим промежуточные результаты
return res; // Возвращаем число Фибоначи для num
}
int main(){
fib(5); // Находим число Фибоначи для пяти
}
/* Консольный вывод программы
num = 1, res = 1
num = 2, res = 2
num = 3, res = 6
num = 4, res = 24
num = 5, res = 120
*/
Рекурсивную функцию всегда можно переписать без использования рекурсии.
#include <iostream>
void split1(int num){ // Нерекурсивно разбиваем число на цифры
while(num){ // Выполняем пока num не равно нулю
int res = num % 10; // Остаток от деления на 10 (последняя цифра)
std::cout << res << ' '; // Выводим последнюю цифру
num = (num - res) / 10; // Отбрасываем последнюю цифру
}
}
void split2(int num){ // Рекурсивно разбиваем число на цифры
if(num){ // При num равном нулю прекращаем рекурсию и функцию
int res = num % 10; // Остаток от деления на 10 (последняя цифра)
std::cout << res << ' '; // Выводим последнюю цифру
split2((num - res) / 10); // Отбрасываем последнюю цифру
}
}
int main(){
split1(1234567890); // 0 9 8 7 6 5 4 3 2 1 Нерекурсивная функция
std::cout << '\n';
split2(1234567890); // 0 9 8 7 6 5 4 3 2 1 Рекурсивная функция
std::cout << '\n';
}
Количество вызовов себя (рекурсий) ограничено и может произойти падение программы.
#include <iostream> // std::cout, std::endl
int rec(int num){ // Вычисляем сумму чисел от 1 до num рекурсивно
int res = 1; // Начальная инициализация
if(num > 1){ // Прерываемся на нуле
res = num + rec(num - 1); // Вызываем рекурсивно себя
}
// std::cout << "num = " << num << ", res = " << res << std::endl; // Выводим промежуточные результаты
return res; // Возвращаем сумму чисел от 1 до num
}
int main(){
std::cout << rec(50000) << '\n'; // При аргументе в 50000 программа падает (у меня)
}