首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oz Mozart阶乘函数

Oz Mozart阶乘函数
EN

Stack Overflow用户
提问于 2014-03-30 18:59:47
回答 1查看 1.3K关注 0票数 1

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

守则是:

代码语言:javascript
复制
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]和我看不到错误在哪里。

EN

回答 1

Stack Overflow用户

发布于 2014-03-31 15:04:40

你想要减少N,没有其他的论点,只有N。

但有一个问题:

  • 列表[1 2 6 24]实际上可以在oz中写成'|'(1 '|'(2 '|'(6 '|'(24 nil))))。 所以在第一次或最后一次调用时,您的函数必须返回24|nil. 但是,您的函数无法知道一个调用是第一个调用还是最后一个调用,因为您没有任何参数。
  • 您的函数不是尾递归函数(如果您使用一本书来学习oz,您会发现原因,以及它的坏原因)

这里是我能想到的最好的功能:

代码语言:javascript
复制
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包含{事实N1},因此不必每次计算它。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22748389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档