OCaml 中的优先级和关联;计算加泰罗尼亚数字时出现意外结果

Precedence and association in OCaml; unexpected result when calculating Catalan numbers

计算第 nth 个加泰罗尼亚数字的简单函数出现意外行为。

let rec catalan x =
    match x with
        0 -> 1
        | n -> catalan(n - 1) * 2 * (2 * n - 1) / (n + 1)

这给出了预期的答案(例如,catalan 3 -> 5)。

然而,

let rec catalan2 x =
    match x with
        0 -> 1
        | n -> (2 * (2 * n - 1) / (n + 1)) * catalan2(n - 1)

给出了意想不到的(不正确的)答案(例如,catalan 3 -> 4)。

在我看来,这些在语义上应该是相同的。我对 OCaml 中运算符的优先级有什么误解吗?

不是整数运算的标识:

(a * b) / c = (b / c) * a

例如:

(2 * 5) / 3 =? (5 / 3) * 2
10 / 3 =? 1 * 2
3 =? 2

整数除法运算/与通常的数学除法(实数)不同。

更新

你有这个:

catalan(n - 1) * 2 * (2 * n - 1) / (n + 1)

您声称它应该与此相同:

(2 * (2 * n - 1) / (n + 1)) * catalan (n - 1)

让我们给子表达式命名。然后你有这个:

a * b * c / d

你说的应该是这样的:

(b * c / d) * a

事实并非如此。这是我上面展示的稍微复杂的版本。