问题描述
用于计算第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
情况并非如此。这是我上面显示的内容的一个稍微复杂的版本。