根据维基catalan definition from wiki ,我看到下面的表达式:
我能理解前两个表达式,但对第三个表达式真的很困惑。 pi 符号代表乘法。表达式是否表示以下代码:
for (int i = 2; i < n + 1; i++) {
sum *= (n + i)/i;
}
我的代码如下
public class Test {
public int getCatalan(int n) {
//Catalan Number = (2n)!/(n+1)!*n!
int product = 1;
if (n == 1)
return 1;
for (int i = 2; i < n + 1; i++) {
product *= (n+i)/i;
}
return product;
}
public static void main(String[] args) {
Test test = new Test();
for (int i = 1;i < 7; i++) {
System.out.println("when i=" + i + " its catalan number is "+ test.getCatalan(i));
}
}
我得到的结果是完全错误的
有人帮帮我吗?
最佳答案
是的。这就是它的大致意思(假设您将 sum
初始化为 1)。
但要小心整数除法。如果你写 (n + i)/i
和两个n
和 i
是整数,您可能会发现自己在某些语言中有一些意想不到的输出。
例如,在 Java 中,如果 n = 3
和 i = 2
, (n + i)/i = 2
, 而不是 2.5
, 自 int / int = int
我们不能存储 2.5
一个整数。
如果你施法 double
或添加 + 0.0
或 * 1.0
在某处,结果将是 double
( double / int = double
) 并且应该是正确的。
还要记住 sum
本身应该是 double
/float
,不是 int
(因为, sum
不能存储 2.5
,类似于上面提到的)。如果您希望输出为 int
,你应该 Math.round
int n = 3;
double product = 1;
for (int i = 2; i <= n; i++) {
product *= (0.0 + n + i)/i;
}
System.out.println(product); // 5
(我还将 i < n + 1
更改为 i <= n
- 后者对我来说似乎更清晰,但它不会在功能上更改代码)
有关更多技术细节,请参阅 JLS - Division Operator /和 Binary Numeric Promotion .
关于algorithm - 关于来自 wiki 的加泰罗尼亚数字的表达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24046236/