【问题标题】:Oz - Write a more efficient functionOz - 写一个更高效的函数
【发布时间】:2015-11-09 12:37:39
【问题描述】:

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

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

【问题讨论】:

    标签: performance function oz


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

    【讨论】:

      猜你喜欢
      • 2012-12-28
      • 1970-01-01
      • 2010-09-21
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 2011-04-11
      相关资源
      最近更新 更多