一、前言
前段時間有學弟問我一些關於二維數組和for循環的題,在幫他解決問題的過程中,我發現了我很久之前對於相關知識的一些盲點部分,趁此機會,彌補一下自身的不足——那時候覺得楊輝三角很複雜,所以也就沒繼續堅持下去。
這篇博客就作爲當時遺憾的完結。
二、楊輝三角介紹
以下內容引用自:https://baijiahao.baidu.com/s?id=1607063654204393620&wfr=spider&for=pc
楊輝三角(也稱帕斯卡三角)相信很多人都不陌生,它是一個無限對稱的數字金字塔,從頂部的單個1開始,下面一行中的每個數字都是上面兩個數字的和。
三、實現思路
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
規律:每一行數字都是上面兩數字的和
四、實現代碼
(一) 非遞歸
public void func(int n) {
if (n < 0){
return;
}
int[][] a = new int[n][n];
for (int i = 0; i < n; i++) {
// 爲第一行數據賦值
if (i == 0){
a[i][i] = 1;
System.out.print(a[i][i]);
}
for (int j = 0; j < n - i; j++) {
System.out.print(" ");
}
// 遍歷每行賦值數據
for (int j = 0; j < i; j++) {
// 爲當前行第一個數賦值
if (j == 0){
a[i][j] = 1;
}else {
// 爲當前行數據賦值 (當前數據爲上一行兩數字的和)
// 注:JVM會默認爲空int數組數據賦值0
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
System.out.printf("%4d",a[i][j]);
}
System.out.println();
}
}
(二) 遞歸
public int deFunc(int i,int j){
// 當前數每行是第一個 或者最後一個 返回 1
if (i == 1 || i == j || j == 1){
return 1;
}else {
// 遞歸調用自己 返回當前行所有數據
return deFunc(i-1,j)+deFunc(i-1,j-1);
}
}
@Test
public void test() {
int length = 10;
// 定義總行數
for (int i = 1; i <= length; i++) {
for (int j = 1; j <= length-i; j++) {
System.out.print(" ");
}
// 打印楊輝三角所有行數據
for (int j = 1; j <= i; j++) {
System.out.printf("%4d",deFunc(i, j));
}
System.out.println();
}
}
結果
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
{\__/} {\__/}
( ·-·) (·-· )
/ >------------------------------------------------< \
| ☆ |
| ☆ |
| ★ |
| ☆ |
| ☆ |
| |
-------------------------------------