2015-11-09 4 views

ответ

1

Я думаю, что это то, что вы ищете:

declare 
fun {Calc N} 
    fun {CalcAux N A B C} 
     if N==0 then A 
     else {CalcAux N-1 B C A+B+C} 
     end 
    end 
in 
    {CalcAux N 2 4 8} 
end 

Три рекурсивных вызовов в одном операторе в вашей версии, это увеличивает количество вызовов функции, но и выполнения размер стека каждый раз, когда вычисляется оператор. Использование трех аккумуляторов (A, B и C) позволяет нам делать не более одного рекурсивного вызова каждый раз, когда мы вводим функцию CalcAux.