算法--组合数学:杨辉三角数学分析以及Java实现

1.定义

杨辉三角,是二项式系数在三角形中的一种几何排列。

下图为杨辉三角部分数据

《算法--组合数学:杨辉三角数学分析以及Java实现》

2.杨辉三角规律

前提:每行端点与结尾的数为1

最重要的规律:

每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。

C(n+1,i)=C(n,i)+C(n,i1)

《算法--组合数学:杨辉三角数学分析以及Java实现》

2.1 杨辉三角与11的幂的关系

假设y=11^n

当n=0时: y=1; 
当n=1时: y=11; 
当n=2时: y=121; 
当n=3时: y=1331; 
当n=4时: y=14641;
……

《算法--组合数学:杨辉三角数学分析以及Java实现》

2.2 杨辉三角与2的幂的关系

假设每一行的和为sum
则sum=2^(行数-1),如下:

第一行:1                             1=2^0
第二行:1 1                         1+1=2^1
第三行:1 2 1                     1+2+1=2^2
第四行:1 3 3 1                 1+3+3+1=2^3
第五行:1 4 6 4 1             1+4+6+4+1=2^4
第六行:1 5 10 10 5 1     1+5+10+10+5+1=2^5
……

《算法--组合数学:杨辉三角数学分析以及Java实现》

2.3 杨辉三角与二项式定理展开式关系

二项式定理公式

《算法--组合数学:杨辉三角数学分析以及Java实现》

二项式与杨辉三角的对应关系:

《算法--组合数学:杨辉三角数学分析以及Java实现》

《算法--组合数学:杨辉三角数学分析以及Java实现》

《算法--组合数学:杨辉三角数学分析以及Java实现》

二项式定理与杨辉三角形是一对天然的数形趣遇,它把数形结合带进了计算数学。求二项式展开式系数的问题,实际上是一种组合数的计算问题。

  • 用系数通项公式来计算,称为“式算”
  • 用杨辉三角形来计算,称作“图算”

3. 杨辉三角的应用

最经典的应用是小时候玩的弹球游戏,这种题目类再高中学习概率时,大家肯定都遇到过。

《算法--组合数学:杨辉三角数学分析以及Java实现》

《算法--组合数学:杨辉三角数学分析以及Java实现》

弹球游戏

小球向容器内跌落,碰到第一层挡物后向两侧跌落碰到第二层阻挡物,再向两侧跌落第三层阻挡物,如此一直下跌最终小球落入底层。根据具体地区获的相应的奖品(AG区奖品最好,BF区奖品次之,CE区奖品第三,D 区奖品差)。

《算法--组合数学:杨辉三角数学分析以及Java实现》

《算法--组合数学:杨辉三角数学分析以及Java实现》

4. Java代码实现杨辉三角

4.1 逻辑分析(用数组):

  • 1)既然知道杨辉三角的规律:从第三行开始中间数是上一行斜对角的两数之和
  • 2)那么我只需要想办法存错上一行的数据即可,用于计算下一行中间的数值
  • 3)因为从第三行才开始出现上述规律,所以我们需要首先要存储第二行的数据,即k=2 – – k为存储上一行数据的数组(若为集合就不需要考虑长度变化的问题了)
  • 4)每一行的长度都在变化,所以k也需要变化,即k++

  • 备注:这里使用的是数组,使用集合会更简单

4.2 打印结果为直角三角形时

《算法--组合数学:杨辉三角数学分析以及Java实现》

4.3 实现代码

package 杨辉三角;

/* * 目的:Java代码实现杨辉三角 * * 逻辑分析(用数组): * 1)既然知道杨辉三角的规律:从第三行开始中间数是上一行斜对角的两数之和 * 2)那么我只需要想办法存错上一行的数据即可,用于计算下一行中间的数值 * 3)因为从第三行才开始出现上述规律,所以我们需要首先要存储第二行的数据,即k=2----k为存储上一行数据的数组(若为集合就不需要考虑长度变化的问题了) * 4)每一行的长度都在变化,所以k也需要变化,即k++ * * 备注:这里使用的是数组,使用集合会更简单 */
public class Test1 {
    public static void main(String[] args) {
        //1.创建存储上一行数据的数组temp
        int k = 2;
        int[] temp = new int[k];
        //1.1 因为两端数均为1,所以给第一个数temp[0]和最后一个数temp[k-1]赋值为1
        temp[0] = temp[k - 1] = 1;

        //2.打印杨辉三角
        //打印的行数--即杨辉三角行数rowCount
        int rowCount = 12;
        for (int i = 1; i <= rowCount; i++) {
            // 建立数组,存取当前行数据
            int[] arr = new int[i];
            // 给当前行数组赋值
            for (int j = 0; j < i; j++) {
                // 先给第一个和最后一个数赋值
                if (j == 0 || j == i - 1) {
                    arr[j] = 1;
                } else {
                    // 中间数为上一行斜对角的两数之和
                    arr[j] = temp[j - 1] + temp[j];
                }
            }
            // 给当前行赋值完毕后让k+1,增加数组长度,用于存取当前行的数据
            k++;
            temp = new int[k];
            // 打印当前行数组,并给新temp赋值,便于下一行使用当前行数据

            for (int y = 0; y < arr.length; y++) {
                temp[y] = arr[y];
                System.out.print(arr[y] + " ");
            }
            System.out.println();
        }

    }
}

4.4 以下内容仅供参考,可以不看

若想打印为等腰三角形,添加一个打印空格效果即可

for(int z=0;z<rowCount-i;z++){
     System.out.print(" ");
 }

完整代码

package 杨辉三角;

public class Test1 {
    public static void main(String[] args) {
        //1.创建存储上一行数据的数组temp
        int k = 2;
        int[] temp = new int[k];
        //1.1 因为两端数均为1,所以给第一个数temp[0]和最后一个数temp[k-1]赋值为1
        temp[0] = temp[k - 1] = 1;

        //2.打印杨辉三角
        //打印的行数--即杨辉三角行数rowCount
        int rowCount = 8;
        for (int i = 1; i <= rowCount; i++) {
            // 建立数组,存取当前行数据
            int[] arr = new int[i];
            // 给当前行数组赋值
            for (int j = 0; j < i; j++) {
                // 先给第一个和最后一个数赋值
                if (j == 0 || j == i - 1) {
                    arr[j] = 1;
                } else {
                    // 中间数为上一行斜对角的两数之和
                    arr[j] = temp[j - 1] + temp[j];
                }
            }
            // 给当前行赋值完毕后让k+1,增加数组长度,用于存取当前行的数据
            k++;
            temp = new int[k];

            //打印空格来实现等腰三角形 
            for(int z=0;z<rowCount-i;z++){
                 System.out.print(" ");
             }

            // 打印当前行数组,并给新temp赋值,便于下一行使用当前行数据
            for (int y = 0; y < arr.length; y++) {
                temp[y] = arr[y];
                System.out.print(arr[y] + " ");
            }
            System.out.println();
        }

    }
}

结果:

《算法--组合数学:杨辉三角数学分析以及Java实现》

    原文作者:杨辉三角问题
    原文地址: https://blog.csdn.net/baidu_37107022/article/details/72853001
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞