【问题标题】:Oz Mozart factorial function奥兹莫扎特阶乘函数
【发布时间】:2014-05-10 00:19:52
【问题描述】:

我有这个当前正在工作的阶乘函数,但我得到的结果不是我需要的。

代码是:

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],而且我看不到错误在哪里。

【问题讨论】:

    标签: oz mozart


    【解决方案1】:

    你想递减 N,除了 N 没有其他参数。
    但是有一个问题:

    • [1 2 6 24] 列表实际上可以写成 '|'(1 '|'(2 '|'(6 '|'(24 nil)))) in 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},因此您不必每次都计算它。

    【讨论】:

    • 谢谢!!您的解释非常有用,因为我没有创建尾递归函数,我正在看一本书以了解有关 oz 的更多信息。
    猜你喜欢
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多