带限制的OCaml阶乘函数

时间:2019-03-19 18:35:44

标签: ocaml

我正在尝试自己学习OCaml,并且已经完成了命令式编程。我发现这个小练习让我完全陷入了如何均匀练习的困境。看起来很简单,但我想我只是缺乏理解。

该问题要求我为阶乘函数编写函数,而不使用rec关键字,并且不带循环。本来应该教我环境模型,但这也使我感到困惑。

我的第一个想法是尝试这样的事情:

   let factorial = 
       let f = ref (fun n -> 0) in  
       let temp_factorial n =
           if n = 0
               then 1
           else
               begin 
                   f := n * !f*(n-1)
                   !f
               end

但是我不确定是否可行。任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:0)

您的代码有点奇怪和错误,但是基本思想是可行的。引用f到类型int -> int的函数后,就可以在以后的代码中自由使用!f。实际上,您可以分配f,以便它引用使用!f的函数。这等效于递归,但是它使用了OCaml的命令性部分。

let f = ref (fun n -> n + 1)

f := 
    (fun n ->
    if n < 2 then 1
    else (* ... left as an exercise ... *)
    )

let factoral n = !f n

关键是部分left as an exercise可以使用!f