OCaml 循环:命令式与递归

Dav*_*ong -1 recursion ocaml functional-programming imperative-programming

我刚刚偶然发现了一些 OCaml 代码,它编写了如下循环:

    let r = ref (f 0) in
    for i = 1 to k - 1 do
      r := f i * !r
    done ;
    !r
  in
Run Code Online (Sandbox Code Playgroud)

这很有趣,因为我通常看到这通常使用 OCaml 中的递归函数来完成。一个相对于另一个有优势吗?

ivg*_*ivg 7

这只是风格问题。OCaml 支持纯函数式和纯命令式风格,并让用户选择适合自己需求的风格。

在这个特定的示例中,使用递归函数的相同实现将具有相同的性能(并且基本上将被编译为相同的代码)。在更复杂的示例中,当引用存储的不是直接对象时(即,当它存储在堆中时),命令式循环可能比纯递归函数慢,因为前者在每次更新时都会涉及写入屏障。

  • 一般来说,如果您正在处理适合命令式编程的数据结构,您将使用命令式循环。数组就是一个很好的例子。 (2认同)