Java温故而知新-杨辉三角形
一、
先说需求
预期结果如图所示
1 这是第几行呢,是第1
1 1 这是第几行呢,是第2
1 2 1 这是第几行呢,是第3
1 3 3 1 这是第几行呢,是第4
1 4 6 4 1 这是第几行呢,是第5
1 5 10 10 5 1 这是第几行呢,是第6
1 6 15 20 15 6 1 这是第几行呢,是第7
1 7 21 35 35 21 7 1 这是第几行呢,是第8
1 8 28 56 70 56 28 8 1 这是第几行呢,是第9
1 9 36 84 126 126 84 36 9 1 这是第几行呢,是第10
二、思路
1、看到这种二维平面打印的需求,我就明白这应该会用双层嵌套循环去解决。
首先可以观察出,第一行1个元素,第二行2个,第n行n个元素,那么就简单了,做一个外层循环去控制打印哪一行,利用行数去控制内层循环打印几个元素,这样循环边界都找出来了。
for(int i = 0;i < arr.length;i++){
for(int j =0;j < i+1;j++){
}
}
2、现在该观察行内元素的特点了,首先会发现首位都是1,这个很显然。
非首尾元素的值,他的值是他上一行中,同列的值和前一列的值的和,那么也很好确认了。
如何去实现这个逻辑呢?挑选一个判断语句吧,当然是ifelse语句了。
首位比较好判断,那就让符合首位的位置是1,其他的位置都去辛苦的求和吧。
if(j == 0||j == i){
arr[i][j] = 1;
}else arr[i][j] = arr[i-1][j-1] +arr[i-1][j];
//头顶上的元素和他前面的元素之和
3、接下来就是实际编码阶段了。有一个要注意的点就是数组的初始化。
第一要在使用二维数组前初始化数组
// 初始化一个二维数组,作为计算基础,暂定有10行
int[][] arr = new int[10][];
第二要在内层循环操作第二维数组时对第二维数组进行初始化,这个是我在洗手间突然恍然大悟的。
// 初始化内层数组
arr[i] = new int[i+1]; //这个一维数组的元素就是一个个数组
4、接下来放源码,可以打印1行到10行的杨辉三角形。注释比较多,习惯于把思路构建好再去编码。
package com.chapter.four;
/**
* 这是4.5.2 的范例2
* 需求 打印输出杨辉三角形
* 思路1 观察杨辉三角形,发现三角形的两边都是1,中间的数都是上一行数对应列与前一列的和
* 2最关键的是第几行就有几个数字
* 3这种平面打印多行的游戏,双层嵌套循环,最常用的就是二维数组了
* 4只要依次求出每一行的数组元素,那么下一行的和元素就可以得到,两边的1特殊处理一下
*
* @author huxingyue
*
*/
class YanghuiTriangle {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 初始化一个二维数组,作为计算基础,暂定有10行
int[][] arr = new int[10][];
// 构造一个双层循环,第一层遍历行数,就是这里的10,
// 注意arr.length这里指的是第一层的长度
for(int i = 0;i < arr.length;i++){
// 初始化内层数组
arr[i] = new int[i+1]; //这个一维数组的元素就是一个个数组
for(int j =0;j < i+1;j++){
if(j == 0||j == i){
arr[i][j] = 1;
}else arr[i][j] = arr[i-1][j-1] +arr[i-1][j];//头顶上的元素和他前面的元素之和
System.out.print(arr[i][j]+"\t");
}
System.out.println("这是第几行呢,是第"+arr[i].length);
}
}
}
类似的题目还有打印空心菱形,都是练习循环结构的题目。、
空心菱形