0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: kotlin, функции, хвостовая рекурсия</p>
1
<p>Теги: kotlin, функции, хвостовая рекурсия</p>
2
<p>В языке программирования Kotlin поддерживается такой стиль функционального программирования, как "хвостовая рекурсия". Какие возможности это предоставляет? Например, можно применять циклические, а не рекурсивные алгоритмы функции, причем без риска переполнения стека. И если функция будет помечена модификатором tailrec, а ее форма будет соответствовать требованиям компилятора, он оптимизирует рекурсию, оставив вместо нее эффективное и быстрое решение задачи, основанное на циклах.</p>
2
<p>В языке программирования Kotlin поддерживается такой стиль функционального программирования, как "хвостовая рекурсия". Какие возможности это предоставляет? Например, можно применять циклические, а не рекурсивные алгоритмы функции, причем без риска переполнения стека. И если функция будет помечена модификатором tailrec, а ее форма будет соответствовать требованиям компилятора, он оптимизирует рекурсию, оставив вместо нее эффективное и быстрое решение задачи, основанное на циклах.</p>
3
<p>Приведем пример:</p>
3
<p>Приведем пример:</p>
4
<p>Вышеуказанный код высчитает<strong>fixpoint</strong>косинуса, не являющегося математической константой. Он просто постоянно будет вызывать<strong>Math.cos</strong>, начиная с 1.0 и до того момента, пока результат не поменяется, приняв значение 0.7390851332151607. Таким образом, можно сказать, что код выше будет эквивалентен следующему коду, написанному в более традиционном стиле:</p>
4
<p>Вышеуказанный код высчитает<strong>fixpoint</strong>косинуса, не являющегося математической константой. Он просто постоянно будет вызывать<strong>Math.cos</strong>, начиная с 1.0 и до того момента, пока результат не поменяется, приняв значение 0.7390851332151607. Таким образом, можно сказать, что код выше будет эквивалентен следующему коду, написанному в более традиционном стиле:</p>
5
<p>Чтобы соответствовать требованиям<strong>tailrec</strong>-модификатора, функция должна сама себя вызывать в качестве последней операции, которую эта функция предпринимает. И вы не сможете применять хвостовую рекурсию,<strong>если есть еще какой-нибудь код после</strong>вызова этой рекурсии. Вдобавок к этому, нельзя использовать хвостовую рекурсию внутри блоков<strong>try/catch/finally</strong>. Также стоит отметить, что на момент написания материала хвостовая рекурсия поддерживалась лишь в backend JVM (виртуальной машины Java).</p>
5
<p>Чтобы соответствовать требованиям<strong>tailrec</strong>-модификатора, функция должна сама себя вызывать в качестве последней операции, которую эта функция предпринимает. И вы не сможете применять хвостовую рекурсию,<strong>если есть еще какой-нибудь код после</strong>вызова этой рекурсии. Вдобавок к этому, нельзя использовать хвостовую рекурсию внутри блоков<strong>try/catch/finally</strong>. Также стоит отметить, что на момент написания материала хвостовая рекурсия поддерживалась лишь в backend JVM (виртуальной машины Java).</p>
6
<p><em>По материалам https://kotlinlang.ru/</em></p>
6
<p><em>По материалам https://kotlinlang.ru/</em></p>
7
7