Рекурсия в С++

В рекурсивной функции обязательно должно быть заключительное условие при котором не вызывается она сама (или будет бесконечный цикл).


#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 программа падает (у меня)
}
2023-10-23



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

Ассемблерный листинг С++
Бенчмарки в С++
Рисование в консоли windows на С++
Функции в С++
Параметры функции в С++
Глоссарий С++. Идентификаторы, квалификаторы, модификаторы, объявление, определение и т.д..
Исключения в С++. Выбрасывание и ловля исключения.
Достоинства и недостатки C++
Сборка приложения без IDE C++ с помощью MinGW и Qt
Перегрузка функций и операторов в С++
Случайные числа в С++. Полиномиальная генерация случайных чисел.
Ссылки в С++
Рекурсия в С++. Примеры рекурсивных программ и без использования.
Шаблоны C++
Наименование переменных и стиль программирования
Версия компилятора С++
Время выполнения программы C++