algorithm - 关于来自 wiki 的加泰罗尼亚数字的表达

标签 algorithm catalan

根据维基catalan definition from wiki ,我看到下面的表达式: enter image description here

我能理解前两个表达式,但对第三个表达式真的很困惑。 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));
    }
}

我得到的结果是完全错误的

enter image description here

有人帮帮我吗?

最佳答案

是的。这就是它的大致意思(假设您将 sum 初始化为 1)。

但要小心整数除法。如果你写 (n + i)/i和两个ni是整数,您可能会发现自己在某些语言中有一些意想不到的输出。

例如,在 Java 中,如果 n = 3i = 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/

相关文章:

algorithm - 如何打印表达式所有可能的平衡括号?

c++ - 使用 for_each 函数显示每个容器元素

algorithm - 通过选择 A 中的一个集合,然后反转该集合并将该集合插入到 A 的开头,将排列序列 A 转换为 B

java - 查找具有最佳优化时间复杂度的数组中最常出现的数字的总和

algorithm - 俄罗斯方 block 拼图的多项式时间解决方案

algorithm - 生成所有具有 n 个叶子的结构不同的完全二叉树

javascript - TypeScript 中的类型级 Catalan 函数

使用 Dynamic Prog 的加泰罗尼亚数字

algorithm - 使用投影的最佳排序算法

c++ - 加泰罗尼亚数字,递归函数时间复杂度