Java编写杨辉三角

五迷三道 提交于 2020-02-15 02:16:14

前言

何为杨辉三角?
在这里插入图片描述

  • 每个数等于它上方两数之和。
  • 每位数字左右对称,由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();//打一行换一行
		}
	    
		
	}
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!