我正在尝试自己学习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
但是我不确定是否可行。任何帮助将不胜感激:)
答案 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
。