Java算法——打印楊輝三角(遞歸—非遞歸)

一、前言

    前段時間有學弟問我一些關於二維數組和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

 

                  {\__/}                                          {\__/}
                  ( ·-·)                                          (·-· )
                  / >------------------------------------------------< \
                           |      ☆                            |
                           |         ☆                         |
                           |  ★                                |
                           |         ☆                         |
                           |      ☆                            |
                           |                                   |
                           -------------------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章