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

一、

先说需求

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

预期结果如图所示

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个元素,那么就简单了,做一个外层循环去控制打印哪一行,利用行数去控制内层循环打印几个元素,这样循环边界都找出来了。

外层是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);
        }

    }

}

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

空心菱形

Java温故而知新-杨辉三角形的更多相关文章

  1. Java实现杨辉三角形

    Java实现杨辉三角形 一.源代码:YFTriangle.java package cn.com.zfc.day009; import java.util.Scanner; /** * 打印杨辉三角形 ...

  2. Java温故而知新-插入排序

    插入排序 插入排序的基本思想是将待排序的元素依次插入序列合适的位置,然后将这个位置后面的元素依次向后移动一位 位置1 2 3 4 5 6 序列5 4 2 1 8 3 设第1位为最初始的基础元素,也就是 ...

  3. Java温故而知新(10)类的加载机制

    类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性 ...

  4. java温故而知新(8)反射机制

    一.什么是反射机制  简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制  有些时候,我们用过 ...

  5. Java温故而知新(7)Object类及其方法讲解

    一.java.lang.Object java.lang包在使用的时候无需显示导入,编译时由编译器自动导入. Object类是类层次结构的根,Java中所有的类从根本上都继承自这个类. Object类 ...

  6. Java温故而知新(4)类String字符串

    字符串是由字符组成,在Java中,字符串是对象,是描述字符的基本数据结构.String类可以用来保存一个字符串,本类是最终类,不允许继承: 1.String对象的创建 初始化 由于String对象特别 ...

  7. Java温故而知新(3)异常处理机制

    异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出 ...

  8. Java温故而知新(2)多线程详解

    多线程指的是在单个程序中可以同时运行多个同的线程执行不同的任务.线程是程序内的顺序控制流,只能使用分配给序的资源和环境.     一.线程与进程的区别 多个进程的内部数据和状态都是完全独立的,而多线程 ...

  9. Java温故而知新(1)集合类

    Java中的集合类有以下所属关系:Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└Wea ...

随机推荐

  1. PHP中通过sqlsrv调用存储过程——成绩排名去除重复字段的数据行

    培训考试项目中,需要实现考试成绩排名:排名参考项为分数(score降序).参加日期(attendtime升序).第几次参加考试(frequency升序):并且,每个用户只保留一条数据(pid). 考试 ...

  2. 【CSS】less 学习小结

    1. less 使用 less 可直接使用浏览器解析 or  使用node 的grunt/gulp 解析成传统css . 推荐开发环境直接使用less 文件调试, 生产环境部署解析好的css 2. l ...

  3. webpack开发与生产环境配置

    前言 作者去年就开始使用webpack, 最早的接触就来自于vue-cli.那个时候工作重点主要也是 vue 的使用,对webpack的配置是知之甚少,期间有问题也是询问大牛 @吕大豹.顺便说一句,对 ...

  4. oracle 通过同义词建立视图

    需要给予以下权限. GRANT CREATE VIEW TO tms;GRANT SELECT ANY table TO tms;GRANT SELECT ANY DICTIONARY TO tms;

  5. [补档][Hnoi2013]游走

    [Hnoi2013]游走 题目 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一 ...

  6. Samba服务部署

    Samba,是种用来让UNIX系列的操作系统与微软Windows操作系统的SMB/CIFS(Server Message Block/Common Internet File System)网络协议做 ...

  7. ReactiveSwift源码解析(十) Lifetime代码实现

    为了之后博客的进行,本篇博客我们就来聊一下ReactiveSwift框架中的Lifetime类的具体实现.从Lifetime这个名字中我们就这道,就是生命周期.在ReactiveSwift中使用Lif ...

  8. struts2上传文件类型列表

    '.a'      : 'application/octet-stream',         '.ai'     : 'application/postscript',         '.aif' ...

  9. 关于dfs+剪枝第一篇:hdu1010

    最近进入了dfs关于剪枝方面的学习,遇到的第一道题就是hdu的1010.一道很基础的剪枝..可我不幸地wa了很多次(待会再解释wa的原因吧QAQ),首先我们来看一下题目. Problem Descri ...

  10. Redis sentinel 哨兵模式集群方案配置

    第一个方案是创建 redis cluster,第二种方案就是用哨兵模式来进行主从替换以及故障恢复.兵模式集群方案配置 一.sentinel介绍 Sentinel作用: 1):Master状态检测 2) ...