虽然我相信我已经为我的功能找到了一个合理的算法(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}}
答案 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