我如何将其变成三角形而不是直角三角形?

时间:2020-03-08 12:01:28

标签: java pascals-triangle

我需要一个用于制作帕斯卡三角形的代码。该代码用于直角三角形,但我需要将其设为Pascal三角形。它需要有10行,并且在顶部和底部帕斯卡三角形的中间确实有间隙。 谁能帮我这个忙。 for循环会很好。谢谢!



    public static int get_pascal(int row, int col) {
        if (col == 0 || col == row) {
            return 1;
        } else {
            return get_pascal(row - 1, col - 1) + get_pascal(row - 1, col);
        }

    }

    public static void main(String[] args) {

        //row size variable
        int rowNum = 5;

        levels = new String[rowNum];

        int i = 0;
        int arIndex = 0;
        System.out.println(recurseRow(i, rowNum, arIndex));
        System.out.println("                                 ");
        System.out.println(upsideDown(rowNum-1));

    }

    //Recursion for row
    public static String recurseRow(int i, int rowNum, int arrayIndex) {
        if( i == rowNum)
            return "";
        else {
            int k = 0;
            int next = i + 1;
            String str = recurseCol(i, k);
            levels[arrayIndex] = str;
            arrayIndex += 1;
            return  str + "\n" + recurseRow(next, rowNum, arrayIndex);
        }
    }

    //Recursion for column
    public static String recurseCol(int i, int k) {
        if(k > i)
            return "";
        else {
            int next = k + 1;
            return get_pascal(i, k) + " " + recurseCol(i, next);
        }
    }


    //upside down recursion
    public static String upsideDown(int index) {
        if(index < 0) {
            return "";
        }

        else {
            String str = levels[index];
            index -= 1;
            return str + "\n" + upsideDown(index);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

Pascal's triangle - 是 二项式系数 的三角形数组,其中第一行和第一列的元素等于 1,所有其他元素是行和列中的前一个元素。

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

您可以创建一个迭代方法来填充这样的数组:

public static int[][] pascalsTriangle(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 void main(String[] args) {
    int n = 10;
    System.out.println("n = " + n);
    System.out.println("Pascal's triangle:");
    int[][] arr = pascalsTriangle(n);
    for (int[] row : arr) {
        for (int element : row)
            System.out.printf("%2d ", element);
        System.out.println();
    }
}

输出:

n = 10
Pascal's 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 

另见:Array of binomial coefficients

答案 1 :(得分:0)

您可以在递归地创建行的位置添加多个空格的前缀:而不是

String str = recurseCol(i, k);

您将拥有

String str = "";
for (int spaces = 0; spaces < 2 * (rowNum - i - 1); spaces++) { 
  str += " ";
}
str += recurseCol(i, k);

您还需要格式化所有数字,使其在recurseCol中具有相同的宽度,例如,现在所有数字均为3位数字:

return String.format("%3d %s", get_pascal(i, k), recurseCol(i, next));

修改后的方法的结果代码:

    //Recursion for row
    public static String recurseRow(int i, int rowNum, int arrayIndex) {
        if( i == rowNum)
            return "";
        else {
            int k = 0;
            int next = i + 1;
            String str = "";
            for (int spaces = 0; spaces < 2 * (rowNum - i - 1); spaces++) {
                    str += " ";
            }
            str += recurseCol(i, k);
            levels[arrayIndex] = str;
            arrayIndex += 1;
            return  str + "\n" + recurseRow(next, rowNum, arrayIndex);
        }
    }

    //Recursion for column
    public static String recurseCol(int i, int k) {
        if(k > i)
            return "";
        else {
            int next = k + 1;
            return String.format("%3d %s", get_pascal(i, k), recurseCol(i, next));
        }
    }

“魔术”数字2和3相互关联:如果每个数字的宽度均为n位数字,则我们需要在由(n-1)个重复的空格组成的字符串中添加前缀(rowNum-i- 1)次。

还有其他方法可以实现这些目标,但我认为上述方法可以使修改最少的结果。