【问题标题】:Best way to generate pascal's triangle (of two mentioned ways)生成帕斯卡三角形的最佳方法(两种提到的方法)
【发布时间】:2011-10-17 23:45:16
【问题描述】:

我有一个 Java 编程任务。

我通过创建一个 nCr ( http://en.wikipedia.org/wiki/Combination ) 函数然后使用双 for 循环通过打印出三角形来实现它。

但是,该赋值要求创建一个不均匀的二维数组,然后通过将前几行中的两个数字相加然后打印出数组来填充。

我知道我将不得不按照它要求的方式完成作业,但是我有一种小小的感觉(至少对于小三角形来说)我实施的方法更好。

哪种方法更好?

【问题讨论】:

    标签: java arrays combinations pascals-triangle


    【解决方案1】:

    我认为作业要求的方法会更好。您的方法需要多次乘法来计算三角形的每个元素。这个数字会随着您需要计算的三角形的每一行而增加。

    然而,赋值的方法需要对三角形的每个元素进行一次加法。

    【讨论】:

      【解决方案2】:

      如果我理解您的问题,您正在尝试比较两种生成帕斯卡三角形的方法:

      1. 通过运行nCr 函数来填充三角形的每个单元格。
      2. 通过简单的加法填充每个单元格,一次生成三角形。

      第二种方法似乎更好。我错过了什么吗?即使您在 nCr 函数中使用 memoization,这些调用也会产生开销。

      【讨论】:

      • 使用 nCr 我根本没有生成数组。
      • 啊,我现在明白了。我一定是看错了。尽管如此,我会说每个单元格进行两次查找和一次添加几乎总是会获胜。您的作业可能要求您将整个三角形保存在内存中,但实际上您只需保留最后两行。随着 n 和 k 的值变大,nCr 函数的 const 也会增长。增量方法不会发生这种情况。
      【解决方案3】:
      1. 使用递归

        /*By using recursion*/
        class RecursivePascal {
            public static void main(String args[]) {
                int n = 100;
                for (int i = 0; i < n; i++) {
                    for (int j = 0; j <= i; j++) {
                        //System.out.print(i+","+j+" ");
                        System.out.print(pascal(i, j) + " ");
                    }
                    System.out.println();
                }
            }
        
            static int pascal(int i, int j) {
                if (j == 0)
                    return 1;
                else if (j == i)
                    return 1;
                else {
                    return pascal(i - 1, j - 1) + pascal(i - 1, j);
                }
            }
        }
        
      2. 使用简单的逻辑

        /*By using logic*/
        class p {
            public static void main(String args[]) {
                int one[] = {1};
                int n = 13;
                System.out.println("1");
                for (int j = 0; j < n; j++) {
                    int two[] = new int[one.length + 1];
                    int twoCounter = 0;
                    for (int i = 0; i < one.length; i++) {
                        if (i == 0) {
                            two[twoCounter++] = one[i];
                            System.out.print(one[i] + " ");
                        }
                        if (i != 0) {
                            two[twoCounter++] = one[i] + one[i - 1];
                            System.out.print((one[i] + one[i - 1]) + " ");
                        }
                        if (i == one.length - 1) {
                            two[twoCounter++] = one[i];
                            System.out.print(one[i] + " ");
                        }
                    }
                    System.out.println();
                    one = two;
                }
            }
        }
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-24
        • 1970-01-01
        • 2014-11-12
        • 2015-01-29
        • 1970-01-01
        相关资源
        最近更新 更多