Что такое хвостовая рекурсия?
Рекурсивная функция является хвостовой рекурсивной, когда рекурсивный вызов — это последнее, что выполняется функцией. Например, следующая функция C ++ print () является хвостовой рекурсивной.
|
Почему мы заботимся?
Хвостовые рекурсивные функции считаются лучше, чем хвостовые рекурсивные функции, поскольку хвостовая рекурсия может быть оптимизирована компилятором. Идея используется компилятором для оптимизации хвостовой рекурсии функций проста, так как рекурсивный вызов последнего утверждения, нет ничего, чтобы сделать в текущей функции, поэтому сохранение кадра стека текущей функции является не использовать (см это более Детали).
Может ли не хвостовая рекурсивная функция быть написана как хвостовая рекурсивная для ее оптимизации?
Рассмотрим следующую функцию для вычисления факториала n. Это не хвостовая рекурсивная функция. Хотя на первый взгляд хвост выглядит рекурсивным. Если мы посмотрим поближе, то увидим, что значение, возвращаемое фактом (n-1), используется в действительности (n), поэтому обращение к факту (n-1) — не последнее, что сделано fact (n)
|
Джава
|
Python 3
|
C #
|
PHP
|
Выход :
120
Вышеуказанная функция может быть записана как хвостовая рекурсивная функция. Идея состоит в том, чтобы использовать еще один аргумент и накапливать факториальное значение во втором аргументе. Когда n достигнет 0, верните накопленное значение.
|
Джава
|
Python 3
|
C #
|
PHP
|
Выход :
120
Следующие статьи на эту тему:
Устранение Хвоста
QuickSort Tail Call Optimization (Сокращение места наихудшего случая для регистрации n)
Ссылки:
http://en.wikipedia.org/wiki/Tail_call
http://c2.com/cgi/wiki?TailRecursion
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Хвостовая рекурсия по Фибоначчи
- Хвостовая рекурсия для вычисления суммы элементов массива.
- Устранение Хвоста
- QuickSort Tail Call Optimization (Сокращение места наихудшего случая для регистрации n)
- Рекурсия
- Найдите значение ln (N!) С помощью рекурсии
- Сумма ряда 1 ^ 1 + 2 ^ 2 + 3 ^ 3 + ….. + n ^ n с использованием рекурсии
- Генерация подмассивов с использованием рекурсии
- Сторнирование очереди с использованием рекурсии
- Произведение из 2 чисел с использованием рекурсии | Набор 2
- Генерация всех возможных подпоследовательностей с использованием рекурсии
- Разница между рекурсией и итерацией
- Сортировать очередь с помощью рекурсии
- Сортировка стека с помощью рекурсии
- Сумма натуральных чисел с использованием рекурсии
0.00 (0%) 0 votes