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. synchronized Lock用法

    在介绍Lock与synchronized时,先介绍下Lock: public interface Lock { void lock(); void lockInterruptibly() throws ...

  2. LuaFramework热更新过程(及可更新的loading界面实现)

          1.名词解释: 资源包:点击 LuaFramework  |  Build XXX(平台名) Resource,框架会自动将自定义指定的资源打包到StreamingAssets文件夹,这个 ...

  3. (转)每天一个linux命令(28):tar命令

    场景:Linux环境中压缩和解压的命令经常会使用到,所以学好这个命令很有必要! 原文出处:http://www.cnblogs.com/peida/archive/2012/11/30/2795656 ...

  4. Azure 认知服务 (4) 计算机视觉API - 读取图片中的文字 (OCR)

    <Windows Azure Platform 系列文章目录> 微软Azure认知服务的计算机视觉API,还提供读取图片中的文字功能 在海外的Windows Azure认知服务的读取图片功 ...

  5. 如何查看appache的端口是否被占用

    win + R 快捷键输入 cmd 打开命令行. 输入 netstat -ano 查看端口使用情况 Ctrl + Shift + Esc 打开 windows 任务管理器,依次单击 [查看][ 选择列 ...

  6. jvm系列 (二) ---垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目 ...

  7. 封装sqlhelper类

    using System;using System.Collections.Generic;using System.Data;using System.Data.Common;using Syste ...

  8. 给View添加手势,防止点击View上其他视图触发点击效果

    在开发过程中,我们可能会遇到这个问题. 当我们给一个view添加了手势,但是我们又不想点击view上面的视图也触发手势.如下图: 我们在红色view上添加了手势,但是又不想点击黄色view也触发.其实 ...

  9. BFS:noi6044鸣人与佐助

    PS:一道XX到我心态崩溃的好(傻逼)题. 先粘题目: 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过 ...

  10. openstack中dashboard页面RuntimeError: Unable to create a new session key. It is likely that the cache is unavailable.

    环境是centos7,直接跑在服务器上. 按照官网一步步安装openstack,到验证dashborad时出错. 登录http://192.168.1.73/dashboard ,输入域名,用户名,密 ...