OCaml 循环:命令式与递归

OCaml loops: imperative vs recursion

我只是偶然发现了一些编写如下循环的 OCaml 代码:

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

这很有趣,因为我通常看到这通常是在 OCaml 中使用递归函数完成的。两者相比有优势吗?

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

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