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

Слайд 2

Функция, которая вызывает сама себя, называется рекурсивной функцией. Рекурсия - вызов функции из самой функции. Пример рекурсивной

Функция, которая вызывает сама себя, называется рекурсивной функцией. Рекурсия - вызов функции
функции - функция вычисления факториала.

Слайд 3

Функция factr(), вычисляет факториал целого числа. Факториал числа N является произведением чисел

Функция factr(), вычисляет факториал целого числа. Факториал числа N является произведением чисел
от 1 до N. Например, факториал 3 равен 1*2*3 или 6. Рекурсивная функция factr() и её итеративный эквивалент fact () показаны ниже:

Слайд 4

Текст презентации

Вызов функций и результаты работы

Текст презентации Вызов функций и результаты работы

Слайд 5

Действие нерекурсивной версии fact() совершенно очевидно. Она использует цикл, начиная с 1

Действие нерекурсивной версии fact() совершенно очевидно. Она использует цикл, начиная с 1
и заканчивая указанным числом, последовательно перемножая каждое число на ранее полученное произведение.
Действие рекурсивной функции factr() более сложно. Когда factr() вызывается с аргументом 1, функция возвращает 1. В противном случае она возвращает произведение factr(n- 1) * n. Для вычисления этого значения factr() вызывается с n-1. Это происходит, пока n не станет равно 1.

Слайд 6

При вычислении факториала числа 2, первый вызов factr() приводит ко второму вызову

При вычислении факториала числа 2, первый вызов factr() приводит ко второму вызову
с аргументом 1. Данный вызов возвращает 1, после чего результат умножается на 2 (исходное значение n). Ответ, таким образом, будет 2. Можно попробовать вставить printf() в factr() для демонстрации уровней и промежуточных ответов каждого вызова.
Когда функция вызывает сама себя, в стеке выделяется место для новых локальных переменных и параметров. Код функции работает с данными переменными. Рекурсивный вызов не создает новую копию функции. Новыми являются только аргументы. Поскольку каждая рекурсивно вызванная функция завершает работу, то старые локальные переменные и параметры удаляются из стека и выполнение продолжается с точки, в которой было обращение внутри этой же функции. Рекурсивные функции вкладываются одна в другую как элементы подзорной трубы.

Слайд 7

Рекурсивные версии большинства подпрограмм могут выполняться немного медленнее, чем их итеративные эквиваленты,

Рекурсивные версии большинства подпрограмм могут выполняться немного медленнее, чем их итеративные эквиваленты,
поскольку к необходимым действиям добавляются вызовы функций. Но в большинстве случаев это не имеет значения. Много рекурсивных вызовов в функции может привести к переполнению стека. Поскольку местом для хранения параметров и локальных переменных функции является стек и каждый новый вызов создает новую копию переменных, пространство стека может исчерпаться. Если это произойдет, то возникнет ошибка - переполнение стека.