0

如何以更有效的方式编写以下函数以减少递归调用的次数?

declare
fun {Calc N}
    if N == 0 then 2
    elseif N == 1 then 4
    elseif N == 2 then 8
    else {Calc N-1}+{Calc N-2}+{Calc N-3}
    end
end
4

1 回答 1

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函数时最多进行一次递归调用。

于 2015-11-09T14:30:01.570 回答