1

現在機能しているこの階乗関数がありますが、結果は必要なものではありません。

コードは次のとおりです。

declare
fun {Fact N}
if N==1 then [N]
  else
    Out={Fact N-1}in
     N*Out.1|Out end
end
{Browse {Fact 4}}

結果は : です[24,6,2,1]が、結果が表示される必要があります:[1,2,6,24]エラーの場所がわかりません。

4

1 に答える 1

2

N 以外の引数を持たずに、N をデクリメントしたいとします。
しかし、問題があります。

  • リスト[1 2 6 24]は実際に'|'(1 '|'(2 '|'(6 '|'(24 nil))))はozのように書くことができる
    ので、最初または最後の呼び出しで、関数は返さ なければなりません24|nil...
    パラメータ。
  • あなたの関数は末尾再帰的ではありません (書籍を使用して oz を学習すると、その理由と、なぜそれが悪いのかがわかります)

これが私が考えることができる最高の機能です:

declare
fun {Fact N}
   fun{Aux N Nmax FactNminus1}
      if N>Nmax then nil
      else (FactNminus1*N)|{Aux N+1 Nmax FactNminus1*N}
      end
   end
in
   {Aux 1 N 1}
end
{Browse {Fact 4}}
  • N は Nmax までインクリメントされます
  • FactNminus1 には {Fact N-1} が含まれているため、毎回計算する必要はありません。
于 2014-03-31T15:04:40.283 に答える