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

この言語で書かれたプログラムを初めて見ましたが、問題を発見したと思います。関数 FactT は再帰的ですよね? FactTの第一引数は「上限」ですよね?問題はここだと思います

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

M (常に 1 に等しい) と M+1 (最初の引数 (N) として渡される) を比較しています。この比較は常に「false」です。たとえば、最初の反復では 1==N (false)、2 回目の反復では 2==N ではなく、1==2 (false) などです。

説明が悪くてすみません。私が言いたかったことを理解していただければ幸いです。

おそらく次のようになります。

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

か何か。

于 2014-10-16T13:14:05.180 に答える
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 に答える