• 杨辉三角形(Java版)


    不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。


    1. 什么是杨辉三角形

        杨辉是一个人名,我国宋代数学家杨辉在其著作《详解九章算法》中给出的一个用数字排列起来的三角形阵。由于杨辉在书中引用了贾宪著的《开方作法本源》和“增乘开方法”,因此这个三角形也称“贾宪三角”。它的规律我们先看如下图:
    在这里插入图片描述
    如上图所示,分析的很清楚了,其实仔细思考一下就很容易看出这和数学中的二项式是有很大的联系的,即(a+b)^n的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项。


    2. 实现思路(方式)

         杨辉三角的实现有很多种,而本篇文章只介绍两种,一种是非常常见,也是比较简单实现的递归方式,另一种是在递归的基础上加上数组的存储功能实现。接下来我们一一刨析。

    2.1 递归方式

        在说思路之前,我们先得理解什么是递归。递归简单的理解方式就是在一个方法中满足一定条件的时候不断调用自身。现在已经理解了什么是递归,那么满足杨辉三角的条件是什么呢?我们看如下图:
    在这里插入图片描述
    由上图所示,把杨辉三角看出行和列,然后再进行分析。我们由图可以看出每一行的第1列和最后1列都是数字1,然后其余的都是从当前数的上一行左右两边相加得到的数字。比如第三行第二列的2,就是上一行得到左右两边相加(1+1)得到的。根据这个规律,就可以得出一条递归公式,我们把行用字母a表示,列用字母b表示,最终得出的公式为:s(a,b)=s(a-1,b-1) + s(a-1,b),根据这个公式就可以得到当前a行b列的数字。

    2.2 递归+数组方式

        根据刚刚的分析,我们已经知道了什么是递归和本篇文章的杨辉三角的递归公式。那么递归+数组的方式就是在递归的基础上加上数组。而我们知道数组是可以存储数据的,那么我们可以利用这个特性把递归出来的每一个数字存到数组中,由此实现了递归+数组的方式。

    代码编写

        经过上述的详情介绍,接下来就是代码实现了。不过在实现代码之前,我们来一个需求,把前面两种方式合并成为一个需求,这种方式实现杨辉三角,我觉得会更有意思。那么我们先看需求:定义一个类,在类中声明两个成员变量总行数和存储杨辉三角每个数字的二维数组,最后定义两个方法,第一个为使用递归获得杨辉三角,第二个为实现存储杨辉三角。这个需求已经介绍的很清晰了,那么废话不多说,直接上代码。

    import java.util.Scanner;
    
    /**
     * 使用递归实现杨辉三角形并把每一行的数据存储到数组中
     */
    public class YangHui {
        private int n; //总行数
        private int[][] array; //存储前n行杨辉三角形的二维数组
    
        /**
         * 构造方法
         */
        public YangHui(){}
    
        public YangHui(int n, int[][] array) {
            this.n = n;
            this.array = array;
        }
    
        /**
         * 使用递归实现杨辉三角形
         * @param a 行
         * @param b 列
         * @return
         */
        public int iter(int a, int b){
            if (b == 1 || b == a){
                return 1;
            }else {
                return iter(a-1,b-1) + iter(a-1,b);
            }
        }
    
        /**
         * 利用数组把杨辉三角形的数据存储到数组中,并打印
         */
        public void printNum() {
            for (int i = 0; i < this.array.length; i++) { //行
                for (int j = 0; j <= i; j++) { //列
                    //调用迭代方法存储到数组中
                    array[i][j] = iter(i + 1, j + 1);
                    //打印
                    System.out.print(array[i][j] + "\t");
                }
                System.out.println();
            }
        }
    
    
        /**
         * 主程序入口
         * @param args
         */
        public static void main(String[] args) {
            //1.使用扫描仪
            Scanner sc = new Scanner(System.in);
            System.out.print("请输入行数:");
            int row = sc.nextInt();
    
            //2.创建实例 并使用构造方法设置对象属性
            YangHui yangHui = new YangHui(row,new int[row][row]);
    
            //4.调用方法打印杨辉三角形
            yangHui.printNum();
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    运行结果如图所示:
    在这里插入图片描述


    总结

    以上就是使用java实现的杨辉三角形,实现的是直角形的杨辉三角,如果想实现等腰形的杨辉三角,可以在存储杨辉三角并打印的printNum方法里进行自行修改。本篇的内容就到此结束了,如果该篇内容觉得对你有所帮助,请留下您的足迹。最后如果上述有所出入,欢迎道友畅聊相关技术。

  • 相关阅读:
    使用Spring Cloud设计电商系统架构
    [C++黑马程序员笔记]P106-P112类和对象-对象特性(1)
    js异步编程面试题你能答上来几道
    基础算法(二)| 归并排序
    踩坑指南:入门OpenTenBase之部署篇
    JS的深拷贝和浅拷贝
    .。。。。。。。。。。
    华为机试真题 Java 实现【学生方阵】
    ffmpeg+安卓+yolo+RK3399部署
    SPA项目开发之首页导航+左侧菜单
  • 原文地址:https://blog.csdn.net/weixin_54679968/article/details/128075117