我需要一个用于制作帕斯卡三角形的代码。该代码用于直角三角形,但我需要将其设为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);
}
}
}
答案 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
答案 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)次。
还有其他方法可以实现这些目标,但我认为上述方法可以使修改最少的结果。