Функции с хвостовой рекурсией в Kotlin | OTUS

Функции с хвостовой рекурсией в Kotlin

В языке программирования Kotlin поддерживается такой стиль функционального программирования, как «хвостовая рекурсия». Какие возможности это предоставляет? Например, можно применять циклические, а не рекурсивные алгоритмы функции, причем без риска переполнения стека. И если функция будет помечена модификатором tailrec, а ее форма будет соответствовать требованиям компилятора, он оптимизирует рекурсию, оставив вместо нее эффективное и быстрое решение задачи, основанное на циклах.

Приведем пример:

1-1801-7febc6.png

Вышеуказанный код высчитает fixpoint косинуса, не являющегося математической константой. Он просто постоянно будет вызывать Math.cos, начиная с 1.0 и до того момента, пока результат не поменяется, приняв значение 0.7390851332151607. Таким образом, можно сказать, что код выше будет эквивалентен следующему коду, написанному в более традиционном стиле:

2-1801-40a8a9.png

Чтобы соответствовать требованиям tailrec-модификатора, функция должна сама себя вызывать в качестве последней операции, которую эта функция предпринимает. И вы не сможете применять хвостовую рекурсию, если есть еще какой-нибудь код после вызова этой рекурсии. Вдобавок к этому, нельзя использовать хвостовую рекурсию внутри блоков try/catch/finally. Также стоит отметить, что на момент написания материала хвостовая рекурсия поддерживалась лишь в backend JVM (виртуальной машины Java).

По материалам https://kotlinlang.ru/

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто