0

虽然我相信我已经为我的函数(阶乘)找到了一个合理的算法,但我对它为什么无限循环感到非常困惑。这是我的代码:

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}}
4

2 回答 2

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
于 2014-10-16T13:23:17.513 回答
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

或者其他的东西。

于 2014-10-16T13:14:05.180 回答