Java温故而知新-杨辉三角形

来源:互联网 发布:sql server 物化视图 编辑:程序博客网 时间:2024/06/05 20:04

Java温故而知新-杨辉三角形
一、
先说需求

需求 打印输出杨辉三角形,行数可变,支持50行内的任意数。

预期结果如图所示

1   这是第几行呢,是第11   1   这是第几行呢,是第21   2   1   这是第几行呢,是第31   3   3   1   这是第几行呢,是第41   4   6   4   1   这是第几行呢,是第51   5   10  10  5   1   这是第几行呢,是第61   6   15  20  15  6   1   这是第几行呢,是第71   7   21  35  35  21  7   1   这是第几行呢,是第81   8   28  56  70  56  28  8   1   这是第几行呢,是第91   9   36  84  126 126 84  36  9   1   这是第几行呢,是第10

二、思路
1、看到这种二维平面打印的需求,我就明白这应该会用双层嵌套循环去解决。
首先可以观察出,第一行1个元素,第二行2个,第n行n个元素,那么就简单了,做一个外层循环去控制打印哪一行,利用行数去控制内层循环打印几个元素,这样循环边界都找出来了。

外层是0到n-1
内层也是0到n-1
两个都是一样的便捷,但是含义大有不同,外层是去控制行数,内层的是去控制行内元素个数。

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);        }    }}

类似的题目还有打印空心菱形,都是练习循环结构的题目。、
空心菱形

0 0
原创粉丝点击