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. for循环问题

    印象中的for语句是这样的,语法:  for (语句 1; 语句 2; 语句 3) { 被执行的代码块 }  语句 1 (代码块)开始前执行 starts. 语句 2 定义运行循环(代码块)的条件 语 ...

  2. VMware workstation批量创建虚拟机和自动化安装操作系统(一)

    一. 简述 作为从事IT行业运维工作的Linuxer,大多情况下需要在测试环境中部署业务系统并进行测试,在没有足够的计算存储网络条件下,使用虚拟机进行虚拟集群的创建和使用,是一种不错的学习和实践方式. ...

  3. jsp元素

    1.指令元素:用于在JSP转换为Servlet阶段提供JSP页面的相关信息,如页面采用的字符编码集.页面中需要导入的类等信息,指令元素不会产生任何的输出到当前JSP的输出流中 指令元素有三种指令:pa ...

  4. python8 字符串操作

    name = "my name is {name} and i am {year} old" print(name.capitalize()) print(name.count(& ...

  5. akoj-1073- Let the Balloon Rise

    Let the Balloon Rise Time Limit:1000MS  Memory Limit:65536K Total Submit:92 Accepted:58 Description ...

  6. linux下安装log4cplus

    wget http://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.1.2/log4cplus-x.x.x.tar.gz t ...

  7. linux文件系统目录解析

    Linux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些目录应该是标准的.各个Linux发行版本会存在一些小小的差异,但总体来说,还是大体差 ...

  8. JavaScript中的尾调用优化

    文章来源自:http://www.zhufengpeixun.com/qianduanjishuziliao/javaScriptzhuanti/2017-08-08/768.html JavaScr ...

  9. android学习ProgressBar的简单使用

    android 提供的ProgressBar控件分为两种,一种是不带进度的进度条,一种是带进度的进度条,如果可以计算任务的完成量那么就用带进度条的,如果无法计算任务量,那么就使用不带进度的进度条.Pr ...

  10. LINUX环境并发服务器的三种实现模型

    服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器.按处理方式来分有循环服务器和并发服务器. 1  循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器,为了 ...