HTML Diff
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