1. 程式人生 > >資料結構與演算法(2)——各種方法實現楊輝三角

資料結構與演算法(2)——各種方法實現楊輝三角

分別用二維陣列、一維陣列、遞迴等三種方法實現楊輝三角;
楊輝三角:首尾都為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(); } } }

期待你更高效的演算法!