Scala в примерах: различия между версиями

Нет изменений в размере ,  6 лет назад
Метка: possible spambot (testing)
Рекурсивый вызов <tt>factorial</tt>, напротив, заканчивается операцией умножения. Отметим, что для рекурсивного вызова <tt>factorial</tt> выделяется новый кадр стека, который стирается после завершения выполнения вызова. Данная реализации функции факториала не хвостово-рекурсивна, и ей необходимо количество памяти, пропорциональное размеру ввода.
 
Говоря более общим языком, если последнее действие функции это вызов другой (возможно, той же самой) функции, то для обеих функций требуется только один кадр стека. Такие вызовы называются хвостовыми. В принципе, хвостовые вызовы могут все время переиспользовать кадр вызывающей функции. Впрочем, в некоторых средах выполнения (например, виртуальная машина Java) нет примитивов для того, чтобы обеспечить эффективное переиспользование кадров стека для хвостовых вызовов. Поэтому реализация Scala должна переиспользовать кадры стека только прямо хвостово-рекурсивных функций, чье последнее действие это вызов самих себя. Другие хвостовые вызовы также могут быть оптимизированы, нано на это не следует надеяться
 
'''Упражнение 4.6.1''' Придумайте хвостово-рекурсивную версию функции <tt>factorial</tt>.
Анонимный участник