算法 杨辉三角求解 java打印杨辉三角 多路递归打印杨辉三角 递归优化杨辉三角 记忆法优化递归 帕斯卡三角形 算法(十二)

1. 杨辉三角:

                    是二项式系数在三角形中的一种几何排列,中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623----1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。 --百度百科

2. 杨辉三角特点:

                               1. 每个数等于它上方两数之和               

                               2. 每行数字左右对称,由1开始逐渐变大

                               3. 第n行的数字有n项

                               4. 前n行共[(1+n)n]/2 个数

                               5. 第n行的m个数可表示为 C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数

3. 图像:

4.公式:

           行 i,列 j ,那么 [i][j] 的取值应为 [i-1]*[j-1] + [i-1][j]

           当i=0 或 i=j 时, [i][j]值为1

5. 多路递归第一版:

package com.nami.algorithm.study.day09;/*** beyond u self and trust u self.** @Author: lbc* @Date: 2023-09-20 14:32* @email: 594599620@qq.com* @Description: keep coding*/
public class PascalTriangle {public static int calculate(int i, int j) {if (i == j || j == 0) {return 1;}return calculate(i - 1, j - 1) + calculate(i - 1, j);}/*** 每行空白区域* @param n* @param i*/private static void printSpace(int n, int i) {// 参数2 与下面打印的 %-4d 的数字有关系,是他的一半int num = (n - 1 - i) * 2;for (int j = 0; j < num; j++) {System.out.print(" ");}}public static void print(int row) {for (int i = 0; i < row; i++) {printSpace(row, i);for (int j = 0; j <= i; j++) {
//                System.out.print(calculate(i, j) + " ");System.out.printf("%-4d", calculate(i, j));}System.out.println();}}public static void main(String[] args) {long start = System.currentTimeMillis();print(10);System.out.println(System.currentTimeMillis() -start + "ms");}}

 6. 当前版本可优化地方,同之前相同,用数组当缓存,存储之前计算得值。他得结果同之前计算得有关系;时间在层数多了之后,速度明显提升

package com.nami.algorithm.study.day09;/*** 二维数组记忆法* beyond u self and trust u self.** @Author: lbc* @Date: 2023-09-20 14:32* @email: 594599620@qq.com* @Description: keep coding*/
public class PascalTrianglePlus {public static int calculate(int[][] cache, int i, int j) {// 判断数组内是否有上一行得值if (cache[i][j] > 0) {return cache[i][j];}if (i == j || j == 0) {cache[i][j] = 1;return 1;}// 存入数组,方便下次使用cache[i][j] = calculate(cache, i - 1, j - 1) + calculate(cache, i - 1, j);return cache[i][j];}/*** 每行空白区域* @param n* @param i*/private static void printSpace(int n, int i) {// 参数2 与下面打印的 %-4d 的数字有关系,是他的一半int num = (n - 1 - i) * 2;for (int j = 0; j < num; j++) {System.out.print(" ");}}public static void print(int row) {// 使用二维数组记忆法// 也可以使用map,但是感觉没有数组简洁,map占用更大int[][] cache = new int[row][];for (int i = 0; i < row; i++) {cache[i] = new int[i + 1];printSpace(row, i);for (int j = 0; j <= i; j++) {
//                System.out.print(calculate(i, j) + " ");System.out.printf("%-4d", calculate(cache, i, j));}System.out.println();}}public static void main(String[] args) {long start = System.currentTimeMillis();print(50);// 当打印30层时候,二者速度:1700ms, 18msSystem.out.println(System.currentTimeMillis() -start + "ms");}}

7. 非递归方式解决,采用直接计算好每行的值

package com.nami.algorithm.study.day09;/*** 非递归方式* beyond u self and trust u self.** @Author: lbc* @Date: 2023-09-20 14:32* @email: 594599620@qq.com* @Description: keep coding*/
public class PascalTriangleUltra {public static void createRow(int[] row, int i) {if (i == 0) {row[0] = 1;return;}for (int j = i; j > 0; j--) {row[j] = row[j] + row[j - 1];}}private static void printSpace(int n, int i) {// 参数2 与下面打印的 %-4d 的数字有关系,是他的一半int num = (n - 1 - i) * 2;for (int j = 0; j < num; j++) {System.out.print(" ");}}public static void print(int row) {// 使用二维数组记忆法// 也可以使用map,但是感觉没有数组简洁,map占用更大int[] cache = new int[row];for (int i = 0; i < row; i++) {createRow(cache, i);printSpace(row, i);for (int j = 0; j <= i; j++) {
//                System.out.print(calculate(i, j) + " ");System.out.printf("%-4d", cache[j]);}System.out.println();}}public static void main(String[] args) {long start = System.currentTimeMillis();print(10);// 当打印40层时候 , plus ,ultra 二者速度:21ms, 21ms 差不多System.out.println(System.currentTimeMillis() - start);}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143591.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

41. Linux系统配置FTP服务器并在QT中使用QFtp实现文件上传

1. 说明 这篇博客主要记录一些在Linux系统中搭建FTP服务器时踩过的一些坑,以及在使用QFtp上传文件时需要注意的问题。 2. FTP环境搭建 在linux系统中,需要安装vsftpd,可以在终端中输入下面的命令进行安装: sudo apt-get install vsftpd使用上述命令安装后,系统中会有一…

Cannot find module ‘core-js/modules/es6.regexp.constructor‘

npm run dev 之后报如下错误 解决方法&#xff1a;npm install core-js2 如果超时或者下载时间慢可以尝试 用cnpm install core-js2

记一次hyperf框架封装swoole自定义进程

背景 公司准备引入swoole和rabbitmq来处理公司业务。因此&#xff0c;我引入hyperf框架&#xff0c;想用swoole的多进程来实现。 自定义启动服务封装 <?php /*** 进程启动服务【manager】*/ declare(strict_types1);namespace App\Command;use Swoole; use Swoole\Proce…

Android 编译插桩操纵字节码

本文讲解如何编译插桩操纵字节码。 就使用 ASM 来实现简单的编译插桩效果&#xff0c;通过插桩实现在每一个 Activity 打开时输出相应的 log 日志。实现思路 过程主要包含两步&#xff1a; 1、遍历项目中所有的 .class 文件​ 如何找到项目中编译生成的所有 .class 文件&#…

pycharm中恢复原始界面布局_常用快捷键_常用设置

文章目录 1 恢复默认布局1 .1直接点击file→Manage IDE Settings→Restore Default Settings&#xff08;如下图所示&#xff09;&#xff1a;1.2 直接点击Restore and Restart&#xff0c; 然后Pycharm就会自动重启&#xff0c;重启之后的界面就是最原始的界面了 2 改变主题2.…

时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测

时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测 目录 时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测&#…

接口测试——接口协议抓包分析与mock_L2

目录&#xff1a; 抓包工具charles抓包工具fiddler抓包工具证书配置app抓包实战练习接口测试实战练习 1.抓包工具charles 工具介绍 支持 SSL 代理支持流量控制支持重发网络请求&#xff0c;方便后端调试支持修改网络请求参数支持网络请求的截获并动态修改可以自动将 json 或…

探索Moonbeam路由流动性的强大功能

Moonbeam的GMP预编译作为MRL的接口&#xff0c;有助于将带有Token的消息从GMP协议&#xff08;通过XCMP&#xff09;传输到与Moonbeam链接的平行链。 为何是个重磅消息&#xff1f;因为这项技术使得将流动性从外部区块链转移到其他波卡平行链成为可能&#xff01; 这里补充一…

Python 3.12.0 正式版即将发布!

导读Python 3.12.0 发布了第 2 个 RC 版本&#xff0c;也是最后一个 RC。正式版将于 2023 年 10 月 2 日星期一发布。 开发团队表示&#xff0c;进入候选版本阶段后&#xff0c;只接受经过 review 且修复明确错误的代码。RC2 是发现并修复重要问题的最后机会。 从该版本开始&a…

Mini Linux嵌入式设备服务器

Digi International推出了具有Digi Embedded Linux的Digi Connect ME 9210。Digi Embedded Linux是为在Digi嵌入式模块和微控制器上开发而优化的最新版本。高性能嵌入式开发服务器大约只有一对骰子大小&#xff0c;是嵌入式Linux上最小的。这使OEM可以在空间受限的设备中使用Li…

【产品运营】如何做好B端产品规划

产品规划是基于当下掌握的多维度信息&#xff0c;为追求特定目的&#xff0c;而制定的产品资源投入计划。 产品规划是基于当下掌握的多维度信息&#xff08;客户需求、市场趋势、竞争对手、竞争策略等&#xff09;&#xff0c;为追求特定目的&#xff08;商业增长、客户满意等&…

SSM - Springboot - MyBatis-Plus 全栈体系(十三)

第三章 MyBatis 一、MyBatis 简介 1. 简介 MyBatis 最初是 Apache 的一个开源项目 iBatis, 2010 年 6 月这个项目由 Apache Software Foundation 迁移到了 Google Code。随着开发团队转投 Google Code 旗下&#xff0c; iBatis3.x 正式更名为 MyBatis。代码于 2013 年 11 月迁…

一文教你如何配置路由策略

【微|信|公|众|号&#xff1a;厦门微思网络】 微思-课程介绍 组网需求 如图1所示&#xff0c;某公司的部门A和部门B相距较远&#xff0c;Router_1和Router_6分别作为这两个部门的出口设备&#xff0c;AS 100内部使用OSPF作为IGP。现要求&#xff1a; 通过部署BGP&#xff0c;使…

每日一练 | 华为认证真题练习Day115

1、FEC(Forwarding Equivalence Class)转发等价类&#xff0c;是一组具有某些共性的数据流的集合&#xff1b;FEC可以根据地址进行划分&#xff0c;但是不能根据业务类型、QoS等要素进行划分。 A. 对 B. 错 2、关于OSI参考模型中网络层的功能说法正确的是&#xff1f; A. OS…

阿里云服务器共享型和企业级独享有什么区别?

阿里云ECS云服务器共享型和企业级有什么区别&#xff1f;企业级就是独享型&#xff0c;共享型和企业级云的主要区别CPU调度模式&#xff0c;共享型是非绑定CPU调度模式&#xff0c;企业级是固定CPU调度模式&#xff0c;共享型云服务器在高负载时计算性能可能出现波动不稳定&…

PHP自动识别采集何意网址文章正文内容

在做PHP采集内容时&#xff0c;用过querylist采集组件&#xff0c;但是这个插件采集页面内容时&#xff0c;都必须要写个采集选择器。这样比较麻烦&#xff0c;每个文章页面都必须指定一条采集规则 。就开始着手找一个插件可以能自动识别任意文章url正文内容并采集的&#xff0…

Python:Django框架的Hello wrold示例

Django是Python的目前很常用的web框架&#xff0c;遵循MVC设计模式。 以下介绍如何安装Django框架&#xff0c;并生成最简单的项目&#xff0c;输出Hello world。(开发工具VScode) 一、安装Django 在VScode终端控制台执行以下指令安装Django python install django 如果要查…

前端新轮子Nue,号称替代Vue、React和Svelte

新的简约前端开发工具集Nue.js 于周三发布。在 Hacker News 上介绍它时&#xff0c;前端开发者和Nue.js 的创作者Tero Piirainen表示&#xff0c;它是 React、Vue、Next.js、Vite、Svelte 和 Astro 的替代品。他在 Nue.js的 FAQ 中进一步解释说&#xff0c;它是为网站和响应式用…

Chrome获取RequestId

Chrome获取RequestId 参考&#xff1a;https://help.aliyun.com/zh/redis/how-do-i-obtain-the-id-of-a-request 在浏览器页面按下F12键&#xff0c;打开开发者工具页面&#xff1b; 在开发者工具页面&#xff0c;单击Network(网络)&#xff1b; 在playload(载荷)窗口中找到目…

Nginx代理victoriametrics集群配置

1,首先安装nginx yum install -y nginx 2,生成密钥文件 安装htpasswd工具 yum install -y httpd-tools 生成密钥文件,prometheus为用户名 htpasswd -c /etc/nginx/conf.d/passwd prometheus 3,修改nginx配置文件nginx.conf,增加如下内容 upstream vmselect {server 10.…