奥兹莫扎特因子函数

时间:2014-03-30 18:59:47

标签: oz mozart

我有这个当前正在运行的阶乘功能,但我所拥有的结果并不是我需要的。

代码是:

declare
fun {Fact N}
if N==1 then [N]
  else
    Out={Fact N-1}in
     N*Out.1|Out end
end
{Browse {Fact 4}}

结果是:[24,6,2,1]但我需要结果显示:[1,2,6,24],我无法查看错误的位置。

1 个答案:

答案 0 :(得分:2)

你想减少N,没有其他参数而不是N.
但是有一个问题:

  • 列表[1 2 6 24]实际上可以写成'|'(1 '|'(2 '|'(6 '|'(24 nil))))以盎司为单位 所以在第一次或最后一次通话时,你的功能必须返回24|nil ...
    但是,您的功能无法知道一个呼叫是第一个呼叫还是最后一个呼叫,因为您没有任何参数。
  • 你的功能不是尾递归(如果你用书来学习盎司,你会发现原因,以及为什么这很糟糕)

这是我能想到的最好的功能:

declare
fun {Fact N}
   fun{Aux N Nmax FactNminus1}
      if N>Nmax then nil
      else (FactNminus1*N)|{Aux N+1 Nmax FactNminus1*N}
      end
   end
in
   {Aux 1 N 1}
end
{Browse {Fact 4}}
  • N增加直到Nmax
  • FactNminus1包含{Fact N-1},因此您不必每次都计算它。