算法:杨辉三角(Pascal's Triangle)

一、杨辉三角介绍

  杨辉三角形,又称帕斯卡三角形、贾宪三角形、海亚姆三角形、巴斯卡三角形,是二项式系数的一种写法,形似三角形,在中国首现于南宋杨辉《详解九章算法》得名,书中杨辉说明是引自贾宪的《释锁算书》,故又名贾宪三角形。在那之前,还有更早发现这个三角的波斯数学家和天文学家,但相关的内容没有以图文保存下来,所以中国的数学家对此研究有很大贡献。

        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

  以上是杨辉三角的前 9 行,可以看出来每一行的所有数字对应着二项式 (A+B)的展开式系数,这里 n 从第 0 行开始。

二、杨辉三角的一些性质与实现


此三角形的性质有(注:最顶的 1 处于第 0 行):

  • 正整数构成,每一行的数字左右对称

  • 第(2的幂)行都是奇数

  • 每一行数字之和都是2的幂

  • N行数字个数都是N

  • N行的第K个数字为组合数

  • 除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第 N 行第 K 数字等于第 N-1 行第 K-1 个数字第 K 个数字的)。

  因而固有恒等式:

        

  可用此性质写出整个杨辉三角形。

 1     /**
 2      * 杨辉三角与 (a+b)^n 二项式系数的展开
 3      *
 4      * @param n
 5      * @param k
 6      * @return
 7      */
 8     private static int binomialCoefficient(int n, int k) {
 9         int res = 1;
10         if (k > n - k) {
11             k = n - k;
12         }
13         for (int i = 0; i < k; i++) {
14             res *= (n - i);
15             res /= (i + 1);
16         }
17         return res;
18     }

  打印杨辉三角的函数:

 1     /**
 2      * 打印杨辉三角
 3      *
 4      * @param n
 5      */
 6     private static void printPascal(int n) {
 7         for (int line = 0; line < n; line++) {
 8             for (int i = 0; i <= line; i++) {
 9                 System.out.print(binomialCoefficient(line, i) + " ");
10             }
11             System.out.println();
12         }
13     }

  算法的时间复杂度大致为 O(N3),这里 N 为所打印杨辉三角的行数。

posted @ 2019-12-24 23:00  賣贾笔的小男孩  阅读(2533)  评论(0编辑  收藏  举报