zoukankan      html  css  js  c++  java
  • 算法:杨辉三角(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 为所打印杨辉三角的行数。

  • 相关阅读:
    js面向对象和PHP面相对象
    git
    css3动画、2D与3D效果
    渲染数据方式
    ajax
    面向对象
    Date 日期
    Math 数值对象
    What is CGLib and JDK动态代理
    IDEA中lock对象不提示newCondition();
  • 原文地址:https://www.cnblogs.com/magic-sea/p/12094089.html
Copyright © 2011-2022 走看看