1.定义
杨辉三角,是二项式系数在三角形中的一种几何排列。
下图为杨辉三角部分数据
2.杨辉三角规律
前提:每行端点与结尾的数为1
最重要的规律:
每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。
C(n+1,i)=C(n,i)+C(n,i−1)
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;
……
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
……
2.3 杨辉三角与二项式定理展开式关系
二项式定理公式
二项式与杨辉三角的对应关系:
二项式定理与杨辉三角形是一对天然的数形趣遇,它把数形结合带进了计算数学。求二项式展开式系数的问题,实际上是一种组合数的计算问题。
- 用系数通项公式来计算,称为“式算”;
- 用杨辉三角形来计算,称作“图算”
3. 杨辉三角的应用
最经典的应用是小时候玩的弹球游戏,这种题目类再高中学习概率时,大家肯定都遇到过。
弹球游戏
小球向容器内跌落,碰到第一层挡物后向两侧跌落碰到第二层阻挡物,再向两侧跌落第三层阻挡物,如此一直下跌最终小球落入底层。根据具体地区获的相应的奖品(AG区奖品最好,BF区奖品次之,CE区奖品第三,D 区奖品差)。
4. Java代码实现杨辉三角
4.1 逻辑分析(用数组):
- 1)既然知道杨辉三角的规律:从第三行开始中间数是上一行斜对角的两数之和
- 2)那么我只需要想办法存错上一行的数据即可,用于计算下一行中间的数值
- 3)因为从第三行才开始出现上述规律,所以我们需要首先要存储第二行的数据,即k=2 - - k为存储上一行数据的数组(若为集合就不需要考虑长度变化的问题了)
4)每一行的长度都在变化,所以k也需要变化,即k++
备注:这里使用的是数组,使用集合会更简单
4.2 打印结果为直角三角形时
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();
}
}
}
结果: