2014-03-05 4 views
7

Я исхожу из функционального программирования и думаю сначала о рекурсивных решениях проблем, а не о итеративных. Я начинаю работать с Rebol немного (в частности, R3) и написал решение к первоклассному ката с помощью хвостовой рекурсивной функции с аккумулятором. Но с любым достаточно большим входом я ударяю стек. У меня есть сценарий для Rebol2 под названием «tail-func.r», который реализует версию оптимизации хвостового вызова, которую AFAIK не портировал на R3. Я знаю, что Rebol 3 во многих случаях реализует вещи по-другому, чем R2, так есть ли способ получить TCO в Rebol 3 без какого-либо дополнительного кода? Если нет, есть ли более простой способ получить его, не перенося старый сценарий?Оптимизация звонков с помощью перебора

Отредактированный, чтобы добавить свой код:

primefactors: function [n m factors] [ 
    either n > 1 
    [ either (modulo n m) == 0 
     [ primefactors (n/m) m (append factors m) ] 
     [ primefactors n (m + 1) factors ] ] 
    [ factors ] 
    ] 

    primefactors 30 2 (copy []) => [2 3 5] 
+0

Можете ли вы предоставить простой фрагмент кода в качестве примера? – johnk

+0

Несомненно, я добавил пример реализации префактора. – teyvk

ответ

3

Не без кода, извините. Rebol не компилируется, поэтому нет возможности заранее знать, что именно представляет собой хвостовой вызов. Даже вызовы функции return распространяют резервную копию стека вызовов быстро, но не с помощью goto.

IIRC автор tail-func работает на Rebol 3 сейчас, и независимо от того, должен ли он делать это, его легко переносить. Теперь, когда вы упомянули об этом, я посмотрю. Функциональные генераторы и препроцессоры легко сделать в Rebol.

+0

Ах, не скомпилированная часть имеет смысл. Я использую для реализаций, которые выполняют хотя бы один шаг оптимизации через код, затем интерпретируют промежуточные результаты (или продолжают генерировать машинный код). – teyvk

Смежные вопросы