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 回答