计算第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中,有什么关于操作符优先级的事情我误解了吗?
发布于 2020-10-24 23:33:36
这不是整数操作的标识:
(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事实并非如此。这是我上面展示的一个稍微复杂一些的版本。
https://stackoverflow.com/questions/64518937
复制相似问题