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
事实并非如此。这是我上面展示的稍微复杂的版本。
计算第 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
事实并非如此。这是我上面展示的稍微复杂的版本。