Написание факториальной функции со списками
Хотя я считаю, что нашел надежный алгоритм для своей функции (факториал), я очень озадачен тем, почему он работает бесконечно. Вот мой код:
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 ответа
Вы никогда не увеличиваете 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
Я вижу программу, написанную на этом языке в первый раз, но я думаю, что нашел проблему. Функция FactT является рекурсивной, верно? Первый аргумент FactT - "верхний предел", верно? Я думаю, что проблема здесь
{FactT (M+1) (M|Acc)}end
Вы сравниваете M (который всегда равен 1) с M+1 (который передается как первый аргумент (N)). Это сравнение всегда "ложно". Например, на первой итерации это 1==N (false), на второй итерации это не 2==N, а 1==2 (false) и так далее.
Извините за плохое объяснение. Я надеюсь, вы понимаете, что я хотел сказать.
Вероятно, это должно выглядеть так:
{FactT N ((M+1)|Acc)}end
или что-то.