前言
何为杨辉三角?
- 每个数等于它上方两数之和。
- 每位数字左右对称,由1开始逐渐变大。
- 第n行有n项。
实现过程:以5行5列的等腰三角为例推导
1.创建多个不同长度的二位数组
1.1 五行五列的直角三角形,需要注意数组的下标比行数小1。
1.2 每一行的个数逐渐加一,即二位数组的低维下标依次加一,往每行分配空间。yh[i]表示高维数组。yh[0]=new int[1];往第一行分配1个存储空间,依次继续则第四行分配5个存储空间。
示意图:
//0
//00
//000
//0000
//00000
int rows=5;
int[][] yh=new int[rows][];
for(int i=0;i<rows;i++){//创建多个不同长度的二位数组
yh[i]=new int[i+1];
}
2.完成初始值赋值
2.1 循环每一行,小于高维数组的长度即可,从第一行开始到第五行。
2.2 为每一行前尾都赋值1,可观察到第几行就有第几个数值。例如:第四行的第一位数表示为yh[3][0]=1,最后位数为yh[3][3]=1。则循环行数就能完成赋值。
示意图:
//1
//11
//101
//1001
//10001
for(int i=0;i<yh.length;i++){//完成赋值
yh[i][0]=1;
yh[i][i]=1;
}
3.计算
3.1 循环遍历二维数组,i表示行数,j表示列数,高维数组的长度为yh.length,低维数组的长度为yh[i].length。但是若内层循环使用yh[i].length,会使数组下标越界,例如当循环到第三行i=2时,会循环三次101,到尾部的1时会将第二行的第二位数与第二行第三位数相加,但是并没有第二行第三位数字。再观察第四行计算两次就行,所以内部循环的条件从1开始的话小于i则可,第五行时从第二列开始内部循环到第四列就行。
3.2 步骤2中的所有为0的数值,需要进行计算。以第三行第二列的2计算为例,它的值为第二行第一列数值+第二行第二列的数值。yh[i][j]=yh[i-1][j]+yh[i-1][j-1]
3.3 行数从第三行开始此时i=2(其余位置的已被步骤2赋值为1),列数从第二列开始此时j=1。
示意图:
//1 //1
//11 //11
//101 //121
//1001 //1331
//10001 //14641
for(int i=2;i<yh.length;i++){
for(int j=1;j<i;j++){
yh[i][j]=yh[i-1][j]+yh[i-1][j-1];
}
}
4.实现等腰效果
4.1 将直角三角打印成等腰三角,空格处暂时以#代替(方便观察)
4.2 首先先写出经过步骤3后打印出直角三角形的效果。
4.3 加入空格效果在打印的外层循环中编辑,每次打印时输出空格,在第五行就不需要打印了说明i=4时就不需要打印。i=0时打印4个,i=1时打印3个。从yh.length-1开始打印递减个数。第一行打印四个,从4开始逐渐-1,则减到0时打印结束。第二行打印三个,从4开始逐渐-1,减到1结束打印,则一直到j>i;结束每一行打印空格的任务
4.4.打印时会发现结果为初始的水平对称状态下的直角三角形。因为仅制表位问题。所以在最内层循环打印输出时在数值的前后均加上制表位。
示意图:
//####1
//###1#1
//##1#2#1
//#1#3#3#1
//1#4#6#4#1
//4.2
for(int i=0;i<yh.length;i++){//打印出二位数组
for(int j=0;j<yh[i].length;j++){
System.out.print(yh[i][j]+"\t");
}
System.out.println();//打一行换一行
}
//4.3
for(int i=0;i<yh.length;i++){
for(int j=yh.length-1;j>i;j--){
System.out.print("\t");
}
for(int j=0;j<yh[i].length;j++){//打印出值
System.out.print(yh[i][j]+"\t");
}
System.out.println();//打一行换一行
}
//4.4
for(int i=0;i<yh.length;i++){
for(int j=yh.length-1;j>i;j--){
System.out.print("\t");
}
for(int j=0;j<yh[i].length;j++){//打印出值
System.out.print("\t"+yh[i][j]+"\t");
}
System.out.println();//打一行换一行
}
最终代码(添加用户输入控制行列数)
import java.util.Scanner;
public class yhtext{
public static void main(String[] args){
System.out.print("请输入杨辉三角的行数或列数:");
int rows =new Scanner(System.in).nextInt();
int[][] yh=new int[rows][];
for(int i=0;i<rows;i++){//创建多个不同长度的二位数组
yh[i]=new int[i+1];
}
for(int i=0;i<yh.length;i++){//完成赋值
yh[i][0]=1;
yh[i][i]=1;
}
for(int i=2;i<yh.length;i++){//以三行二列处为例
for(int j=1;j<i;j++){
yh[i][j]=yh[i-1][j]+yh[i-1][j-1];
}
}
for(int i=0;i<yh.length;i++){
for(int j=yh.length-1;j>i;j--){
System.out.print("\t");
}
for(int j=0;j<yh[i].length;j++){//打印出值
System.out.print("\t"+yh[i][j]+"\t");
}
System.out.println();//打一行换一行
}
}
}
来源:CSDN
作者:NULL_KUN
链接:https://blog.csdn.net/weixin_44255829/article/details/104302942