資料結構與演算法(2)——各種方法實現楊輝三角
阿新 • • 發佈:2019-01-30
分別用二維陣列、一維陣列、遞迴等三種方法實現楊輝三角;
楊輝三角:首尾都為1,中間數值等於其肩上兩個數值之和,形如下面:
1
1 1
1 2 1
1 3 3 1
意義:楊輝三角是二項式(a+b)^n展開式的係數表,比如n=2時
(a+b)^2 = a^2 + 2ab + b^2
係數對應為 1 2 1,正好是楊輝三角的第三行
如下是完整的Java程式碼:
package algorithm;
public class YangHui {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
YangHui yh = new YangHui();
yh.pattern(4);//模型化輸出
yh.dyadic(17);//二維陣列實現
yh.linear(14);//一維陣列實現
yh.recurrencePrint(14);//遞迴實現
}
// 模型化輸出
public void pattern(int n) {
for (int i = 1; i <= n; i++) {// i控制行
for (int k = 1; k <= n - i; k++) {// k控制列空格
System.out.print(" ");
}
for (int j = 1; j <= 2 * i - 1; j++) {// j控制列*
System.out.print("*");
}
System.out.println();// 換行
}
}
// 二維陣列實現
public void dyadic(int n) {
int[][] a = new int[n][n];
for (int i = 0; i < n; i++) {
for (int k = 1; k < n - i; k++) {
System.out.printf("%3s", " ");// 控制左邊空格,以輸出字串的一半字元量為單位
}
for (int j = 0; j <= i; j++) {
if (j == 0 || j == i) {
a[i][j] = 1;// 首尾都是1
} else {
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];// 中間值等於其肩上兩個值之和
}
System.out.printf("%-6s", a[i][j]);// 左對齊,每個輸出字元佔6個位元組,可保證5位數之內保持齊整
}
System.out.println();
}
}
// 一維陣列實現
public void linear(int n) {
int[] a = new int[n];
// 用變數i來控制行,用一維陣列a[i]來記錄每一行的數值
for (int i = 0; i < n; i++) {
a[i] = 1;// 由於i一直在++,因此a[0]=1將永遠都不會變了,同時a[i],即每一行的最後一個數值也將永遠為1
for (int k = 1; k < n - i; k++) {
System.out.printf("%3s", " ");// 輸出左邊空格
}
for (int j = i - 1; j > 0; j--) {
/*
* 由於楊輝三角成金字塔形,後一行比前一行多出首尾兩個數字,而當變數i每次變化的時候,
* 第一個數字永遠定格為1,不會再更新,但是每一行的最後一個值每次都會隨著i的變化被賦值為1,
* 雖然i已經+1了,但是a[i]中首尾之間的數值依然沒有變化,還是上一行的值,這就是本演算法的核心點;
* 等號右邊的a[j-1]和a[j]是上一行,即i-1時的值,等號左邊的a[j]才是當前i的值;
*/
a[j] = a[j - 1] + a[j];
}
for (int j = 0; j <= i; j++) {
System.out.printf("%-6s", a[j]);// 倒著計算,順著輸出,左對齊
}
System.out.println();
}
}
// 遞迴實現
public int recurrence(int i, int j) {
if (i == j || j == 0) {
return 1;// j=0代表每行的第一列,i==j代表每行的最後一列
} else {
return recurrence(i - 1, j - 1) + recurrence(i - 1, j);// 從源頭尋找遞迴加和
}
}
// 遞迴列印
public void recurrencePrint(int n) {
for (int i = 0; i < n; i++) {
for (int k = 1; k < n - i; k++) {
System.out.printf("%3s", "");
}
for (int j = 0; j <= i; j++) {
System.out.printf("%-6s", recurrence(i, j));
}
System.out.println();
}
}
}
期待你更高效的演算法!