Написание факториальной функции со списками

Хотя я считаю, что нашел надежный алгоритм для своей функции (факториал), я очень озадачен тем, почему он работает бесконечно. Вот мой код:

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

или что-то.

Другие вопросы по тегам