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

问题描述

用于计算第n 加泰罗尼亚数字的简单函数中的意外行为。

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

这给出了预期的答案(例如,加泰罗尼亚语3-> 5)。

但是,

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

给出了意外(错误)的答案(例如, ,加泰罗尼亚语3-> 4)。

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

解决方法

这不是 整数运算的标识:

single

例如:

(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

情况并非如此。这是我上面显示的内容的一个稍微复杂的版本。