【问题标题】:Print Pascal's Triangle using recursion使用递归打印帕斯卡三角形
【发布时间】:2020-08-14 16:12:49
【问题描述】:

我正在尝试开发一个使用递归打印出 Pascal's Triangle 的程序。这是我的代码:

public class PascalTriangle {
    public static int[] computePT(int k) {
        int[] pt = new int[k + 1];
        if (k == 0) {
            pt[0] = 1;
            return pt;
        } else {
            int[] ppt = computePT(k - 1);
            pt[0] = pt[k] = 1;
            for (int i = 1; i < ppt.length; i++) {
                pt[i] = ppt[i - 1] + ppt[i];
            }
        }
        return pt;
    }
}
public class PascalTriangleDriver {
    public static void main(String args[]) {
        int k = 10;

        int arr[] = PascalTriangle.computePT(k);

        for (int i = 0; i < arr.length; i++)
            System.out.print(arr[i] + " ");

        System.out.println();
    }
}

代码运行完美,但是我的问题是我想修改我的PascalTriangle 代码(不是PascalTriangleDriver 代码),例如当k=10 时,它会打印出来:

1 9 36 84 126 126 84 36 9 1

代替:

1 10 45 120 210 252 210 120 45 10 1

【问题讨论】:

    标签: java arrays recursion pascals-triangle


    【解决方案1】:

    您似乎犯了一个偏离 1 的错误。解决此问题的一种简单方法是编写另一个方法,使用 k-1 调用您的原始方法:

    // this is your original method, just renamed:
    private static int[] computePTImpl(int k) {
        int[] pt = new int[k + 1];
        if (k == 0) {
            pt[0] = 1;
            return pt;
        } else {
            int[] ppt = computePT(k - 1);
            pt[0] = pt[k] = 1;
            for (int i = 1; i < ppt.length; i++) {
                pt[i] = ppt[i - 1] + ppt[i];
            }
        }
        return pt;
    }
    
    // you will call this method:
    public static int[] computePT(int k) {
        return computePT(k - 1);
    }
    

    或者,您实际上可以通过将ks 替换为k-1s 来修复您的代码:

    public static int[] computePT(int k) {
        int[] pt = new int[k]; // note the change
        if (k == 1) { // note the change
            pt[0] = 1;
            return pt;
        } else {
            int[] ppt = computePT(k - 1);
            pt[0] = pt[k - 1] = 1; // note the change
            for (int i = 1; i < ppt.length; i++) {
                pt[i] = ppt[i - 1] + ppt[i];
            }
        }
        return pt;
    }
    

    请注意,我们不会更改递归调用,因为如果我们这样做了,我们会说帕斯卡三角形的第 k-th 行依赖于第 k-2-th 行,这是不正确的。

    【讨论】:

      【解决方案2】:

      您可以迭代地填充一个二项式系数数组,如下所示:第一行和第一列用1填充,所有其他元素等于行和列中的前一个元素。

      T[i][j] = T[i][j-1] + T[i-1][j];
      

      您可以创建两种方法:一种返回包含三角形的二维数组,第二种返回该三角形的 base。它更有助于清晰。

      输出:

      Triangle:
       1  1  1  1  1  1  1  1  1  1 
       1  2  3  4  5  6  7  8  9 
       1  3  6 10 15 21 28 36 
       1  4 10 20 35 56 84 
       1  5 15 35 70 126 
       1  6 21 56 126 
       1  7 28 84 
       1  8 36 
       1  9 
       1 
      Base:
      [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
      

      代码:

      public static void main(String[] args) {
          int n = 10;
          System.out.println("Triangle:");
          int[][] arr = binomialTriangle(n);
          for (int i = 0; i < arr.length; i++) {
              for (int j = 0; j < arr[i].length; j++)
                  if (arr[i][j] > 0)
                      System.out.printf("%2d ", arr[i][j]);
              System.out.println();
          }
      
          int[] base = binomial(arr);
          System.out.println("Base:");
          System.out.println(Arrays.toString(base));
      }
      
      public static int[][] binomialTriangle(int n) {
          // an array of 'n' rows
          int[][] arr = new int[n][];
          // iterate over the rows of the array
          for (int i = 0; i < n; i++) {
              // a row of 'n-i' elements
              arr[i] = new int[n - i];
              // iterate over the elements of the row
              for (int j = 0; j < n - i; j++) {
                  if (i == 0 || j == 0) {
                      // elements of the first row
                      // and column are equal to one
                      arr[i][j] = 1;
                  } else {
                      // all other elements are the sum of the
                      // previous element in the row and column
                      arr[i][j] = arr[i][j - 1] + arr[i - 1][j];
                  }
              }
          }
          return arr;
      }
      
      public static int[] binomial(int[][] arr) {
          int[] base = new int[arr.length];
          for (int i = 0; i < arr.length; i++) {
              // the last element in the row
              base[i] = arr[i][arr[i].length - 1];
          }
          return base;
      }
      

      另见:Finding trinomial coefficients using dynamic programming

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多