Функции с хвостовой рекурсией в Kotlin | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Team Lead Архитектура и шаблоны проектирования Разработчик IoT C# Developer. Professional PostgreSQL Подготовка к сертификации Oracle Java Programmer (OCAJP) C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Symfony Framework Unity Game Developer. Basic JavaScript Developer. Professional Android Developer. Basic JavaScript Developer. Basic Java Developer. Professional Highload Architect Reverse-Engineering. Professional Java Developer. Basic PHP Developer. Professional Алгоритмы и структуры данных Framework Laravel Cloud Solution Architecture Vue.js разработчик Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool" PHP Developer. Basic
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK Дизайн сетей ЦОД Разработчик IoT PostgreSQL Экспресс-курс "Версионирование и командная работа с помощью Git"
-30%
Экспресс-курс «Введение в непрерывную поставку на базе Docker» Базы данных Reverse-Engineering. Professional Administrator Linux. Professional Network engineer Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool" Network engineer. Basic
Корпоративные курсы
Безопасность веб-приложений IT-Recruiter Дизайн сетей ЦОД Компьютерное зрение Разработчик IoT Вебинар CERTIPORT Machine Learning. Professional
-6%
NoSQL Пентест. Практика тестирования на проникновение Java QA Engineer. Базовый курс Руководитель поддержки пользователей в IT
-8%
SRE практики и инструменты Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Infrastructure as a code Супер-практикум по использованию и настройке GIT Промышленный ML на больших данных Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» BPMN: Моделирование бизнес-процессов Основы Windows Server
Специализации Курсы в разработке Подготовительные курсы Подписка
+7 499 938-92-02

Функции с хвостовой рекурсией в 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 комментариев
Для комментирования необходимо авторизоваться