經典演算法(5)楊輝三角

揚帆向海發表於2020-01-11

寫在前面: 我是 揚帆向海,這個暱稱來源於我的名字以及女朋友的名字。我熱愛技術、熱愛開源、熱愛程式設計。技術是開源的、知識是共享的。

這部落格是對自己學習的一點點總結及記錄,如果您對 Java演算法 感興趣,可以關注我的動態,我們一起學習。

用知識改變命運,讓我們的家人過上更好的生活

一、楊輝三角的介紹

百度百科對於楊輝三角是這樣介紹的:
在這裡插入圖片描述

二、楊輝三角的演算法思想

(此圖片來源於網路)

楊輝三角的兩個腰邊的數都是 1,從第3行起,除第一個數和最後一個數外,其它位置的數都是上頂上兩個數之和。

三、程式碼實現

1.第一種寫法

public class YangHuiTriangle1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("輸入要列印的行數:");
        int n = scanner.nextInt();
        // 列印楊輝三角
        getTriangle(n);
    }

    /**
     * 列印楊輝三角
     *
     * @param n 要列印的行數
     * @return
     */
    private static int[][] getTriangle(int n) {
        // 建立一個二維陣列,此二維陣列用來存放楊輝三角中每一行的值
        int[][] array = new int[n][n];
        // 給陣列元素賦值
        for (int i = 0; i < array.length; i++) {
            // 每一行的值
            array[i] = new int[i + 1];
            // 給首末元素賦值
            array[i][0] = array[i][i] = 1;
            // 給每行的非首末元素賦值
            if (i > 1) {
                for (int j = 1; j < array[i].length - 1; j++) {
                    array[i][j] = array[i - 1][j - 1] + array[i - 1][j];
                }
            }
        }
        // 遍歷二維陣列
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + "\t");
            }
            System.out.println();
        }
        return array;
    }
}

程式碼執行結果:

輸入要列印的行數:10
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	

2.第二種寫法

public class YangHuiTriangle2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("輸入要列印的行數:");
        int n = scanner.nextInt();
        // 列印楊輝三角
        int array[][] = getTriangle(n);
        //  列印成等腰三角形
        printTriangle(array);
    }

    private static int[][] getTriangle(int n) {
        // 建立一個二維陣列,此二維陣列用來存放楊輝三角中每一行的值
        int[][] array = new int[n][n];
        // 給陣列元素賦值
        for (int i = 0; i < array.length; i++) {
            // 每一行的值
            array[i] = new int[i + 1];
            // 給首末元素賦值
            array[i][0] = array[i][i] = 1;
            // 給每行的非首末元素賦值
            if (i > 1) {
                for (int j = 1; j < array[i].length - 1; j++) {
                    array[i][j] = array[i - 1][j - 1] + array[i - 1][j];
                }
            }
        }
        return array;
    }

    /**
     * 列印成等腰三角形
     *
     * @param array
     */
    public static void printTriangle(int[][] array) {
        for (int i = 0; i < array.length; i++) {
            // 輸出楊輝三角數字前面的空格
            for (int j = 0; j < array.length - 1 - i; j++) {
                System.out.print("   ");
            }
            for (int j = 0; j <= i; j++) {
                // 用空格填補空位置
                System.out.print("   ");
                // 以十進位制整數的形式輸出,位寬是3,左對齊
                System.out.printf("%-3d", array[i][j]);
            }
            System.out.println();
        }
    }
}

程式碼執行結果:

輸入要列印的行數:
10
                              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  

上一篇 經典演算法(4)一文搞懂什麼是 快速排序
下一篇 經典演算法(6)斐波拉契數列、兔子繁殖、跳臺階演算法

相關文章