用列表编写因子函数

时间:2014-10-16 12:38:36

标签: tail-recursion invariants oz mozart

虽然我相信我已经为我的功能找到了一个合理的算法(Factorial)但我很困惑为什么它无限循环。 这是我的代码:

declare
fun{Fact N}
   local M=1 in             %I suppose it loops from here??
      local FactT in        %But the function call starts from here
     fun{FactT N Acc}       % which doesn't include the local declaration of M
        if M==N then
           {Browse M}
           Acc
        else
           %{Browse M}     %displays infinite lines of 1s
           %{Browse N}
           %{Browse Acc}   %They form a continuously growing list of 1s
           {FactT (M+1) (M|Acc)}end
     end
     {FactT N nil}
      end
   end
end

{Browse {Fact 3}}

2 个答案:

答案 0 :(得分:0)

我第一次看到用这种语言编写的程序,但我认为我发现了问题。 函数FactT是递归的,对吧? FactT的第一个参数是"上限",对吗? 我认为问题出在这里

{FactT (M+1) (M|Acc)}end

您将M(总是等于1)与M + 1(作为第一个参数(N)传递)进行比较。这种比较总是"假"。例如,在第一次迭代时它是1 == N(假),在第二次迭代时它不是2 == N,它是1 == 2(假)等等。

抱歉说不好。我希望你明白我想说的话。

可能看起来应该是这样的:

{FactT N ((M+1)|Acc)}end

或其他什么。

答案 1 :(得分:0)

你永远不会增加M => {Fact (M+1) (M|Acc}}始终为{Fact 2 1|Acc}

为了使您的代码更具可读性,您不会被写为

fun...
   local ...
   in ...
   end
end

你可以写

fun...
   ...
in
   ...
end

考虑到这些因素,最简单的因子功能是

declare
fun {Fact N}
   fun{Aux N Acc}
      if N=<0 then Acc
      else {Aux N-1 N*Acc}
      end
   end
in
   {Aux N 1}
end