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. C/C++中static的用法全局变量与局部变量

    1.什么是static? static 是C/C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 1.1static的引入 我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它 ...

  2. (转)Spring boot——logback.xml 配置详解(四)<filter>

    文章转载自:http://aub.iteye.com/blog/1101260,在此对作者的辛苦表示感谢! 1 filter的使用 <filter>: Logback的过滤器基于三值逻辑( ...

  3. java 线程之concurrent中的常用工具 CyclicBarrier

    一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序 ...

  4. 自动生成proto Js语句

    在与后端的WebSocket通信时,前端要带一个proto文件是一个累赘的事情.首先是明显的曝光了协议实体对象,再一个浏览器客户端很容易会缓存该文件,新的协议更新可能导致客户端不能使用,另外在cdn服 ...

  5. python数据库学习--Mysql

    摘要: Python使用mysql需要安装驱动,有两种1)mysqldb 2)umysql  ,两者都是开源,具体区别不详,umysql没用过 一.mysqldb 安装MySQL驱动--http:// ...

  6. Swift 细节

    1.swift ?和 !的区别 1.1 Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化.如果在使 ...

  7. nodeJS之域名DNS

    前面的话 本文将详细介绍域名解析模块DNS 工作原理 打开浏览器,在上方地址栏输入网址的那一刻,这个回车按了之后,发生了很多事情.首先,计算机只懂0和1,也就是说人类的字母网址计算机是不懂的,它只认识 ...

  8. zabbix前台jsrpc注入

    zabbix是一个开源的企业级性能监控解决方案. 官方网站:http://www.zabbix.com zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者 ...

  9. JavaScript数组方法大全

    1.两个数组拼接的方法: Array.concat(obj); var array = [1,2,3]; var array2 = [4,5,6]; var arrtotall = array.con ...

  10. c++STL(栈、队列)

    栈stack -先入后出FILO 栈可以理解为一个坑,先掉坑里的被压在下面,等上面的走了才能出来 头文件 <stack> 入栈 push(某东西); 栈顶元素出栈 pop(); 是否为空 ...