【杨辉三角的两种解法——(超级详细)】

杨辉三角

1.杨辉三角简介🕵️

杨辉三角,是二项式系数在三角形中的一种几何排列。在欧洲,这个表叫做帕斯卡三角形。帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年。杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。杨辉三角是中国数学史上的一个伟大成就。

杨辉三角

在知道了杨辉三角后,那我们怎么样来实现它呢?下面就来介绍c语言最常见的两种解法,数组法递归法

2解法

2.1数组法🧐

数组法是我们最容易想到的一种解法,当我们把杨辉三角适当变形一下,如下图

在这里插入图片描述

看到这个图时,二维数组的这种解法便油然而生。这时候我们不慌写代码,先把思路理清楚,下笔才能“如有神”。

思路实现 😊

在这里插入图片描述
观察杨辉三角我们得知,每一行的第一个数据必为1,每一列的最后一个也是必为1,我们又知道每一行数据的个数刚好等于行数,例如第五行有五个数据,第七行有七个数据。也就是说当每一行的列数等于1时,或者列数等于行数时,其数据必为1。

在这里插入图片描述
除去每一行的第一个和最后一个数,我们还观察知道,中间的每一个数都等于他的上一行的相同列的数加上一行的前一列的数。例如,第五行第三列的数6,等于第四行第二列的数3加上第四行第三列的数3。

由此,我们实现的大概思路就是,定义一个二维数组,遍历二维数组将相应地数据存放到二维数组中,最后打印二维数组。

代码实现💻

前提准备🤯

首先我们先定义一个二维数组arr1,Rows和Cols分别是行和列,我们用define来定义行和列。

#define Row 100
#define Col 100

我们还定义了一个num值,表示打印num行的杨辉三角,并且利用断言assert,num值小于Rows,否则报错程序结束。

    int num = 0;int arr[Row][Col] = { 0 };scanf("%d", &num);assert(num < Row);

写入✍️

二维数组定义好之后,我们接下来就是把相应的数据存放到二维数组中,这里我们利用两层for循环嵌套遍历二维数组写入数据。代码如下:

for (int i = 0; i < num; i++){for (int j = 0; j <= i; j++){if (j == 0 || j == i){arr[i][j] = 1;}else{arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];}}}

这里我们需要注意的是,二维数组下标是从0开始,所以说我们把i和j的初值都赋值为0,并在if的判定条件里将 j == 1修改为j == 0。

输出✍️

输出打印杨辉三角我们还是利用两层for循环嵌套遍历打印输出,代码如下:

for (int i = 0; i < num; i++){/*blank = num - i - 1;while (blank--){printf(" ");}*/for (int j = 0; j <= i; j++){printf("%-3d ", arr[i][j]);}printf("\n");}

这里我们需要注意的是里面多了个blank变量和一个while循环,这两个的作用是打印每行数据前的空格,使我们打印出来的杨辉三角接近等腰三角形,我们去掉的话打印出来的杨辉三角是直角三角形,实况图如下:

打印空格图:
在这里插入图片描述
去掉空格图:
在这里插入图片描述
还有一点就是%2d的2表示输出宽度,当大于输出宽度时,数据按原数据输出。当小于输出宽度2时,默认前补空格,有右对齐的效果。%-2d相反

源代码🐒

#include<stdio.h>
#include<assert.h>
#define Row 100
#define Col 100
int main()
{int num = 0;int blank = 0;int arr[Row][Col] = { 0 };scanf("%d", &num);assert(num < Row);for (int i = 0; i < num; i++){for (int j = 0; j <= i; j++){if (j == 0 || j == i){arr[i][j] = 1;}else{arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];}}}for (int i = 0; i < num; i++){/*blank = num - i - 1;while (blank--){printf(" ");}*/for (int j = 0; j <= i; j++){printf("%-3d ", arr[i][j]);}printf("\n");}return 0;
}

2.2递归法🧐

思路实现🕵️

我们知道杨辉三角除去每一行的第一个和最后一个数是1外,其他的每个数都是其上一行的同一列与前一列的和,而我们要用递归法的话就需要先确定递归的两大要点,出口和递归体。我们画图来分析递归的解法。

在这里插入图片描述

如上图,如果我们要打印第五行的6的话,就等于第四行的3加上3,而两个3又分别等于第三行的1加上2,2又等于1加上1。由此可知,递归的出口为当列数为第一列或者最后一列时,返回数据1。递归体为上一行的同一列加上前一列,如果不是第一列或者最后一列时就继续递归。如下图:

在这里插入图片描述
代码实现💻
主函数✍️

int main()
{int num = 0;int blank = 0;scanf("%d", &num);for (int i = 0; i < num; i++){/*blank = num - i - 1;while (blank--){printf(" ");}*/for (int j = 0; j <= i; j++){printf("%2d ", Back_print(i, j));}printf("\n");}

这里的num和blank,while循环的功能与上文说的一样,就不提了。这里我们需要注意的是我们还是利用双层for循环嵌套,利用递归函数Back_Print的返回值直接打印。

递归函数✍️

int Back_print(int rows, int cols)
{if (cols == 0 || cols == rows){return 1;}else{return Back_print(rows - 1, cols) + Back_print(rows - 1, cols - 1);}}

这里我们需要注意的是,由于i与j的初始化还是从0开始,所以我们if的判定条件还是当Cols等于0或者Cols==Rows时,返回1。否则就递归传入上一行的同一列和前一列加起来。结果如图:

在这里插入图片描述
去掉banlk后
在这里插入图片描述

源代码🐒

//递归法
int Back_print(int rows, int cols)
{if (cols == 0 || cols == rows){return 1;}else{return Back_print(rows - 1, cols) + Back_print(rows - 1, cols - 1);}}
int main()
{int num = 0;int blank = 0;scanf("%d", &num);for (int i = 0; i < num; i++){/*blank = num - i - 1;while (blank--){printf(" ");}*/for (int j = 0; j <= i; j++){printf("%2d ", Back_print(i, j));}printf("\n");}return 0;
}

杨辉三角的解法多种多样,这里介绍了比较常见的两种,相比较于递归法,数组法更加容易理解,递归法就相对来说比较抽象,对于递归法作者的建议是多多画图理解。递归法相比较于数组法,省去了二维数组的定义,不需要将数据存放直接打印,两种解法各有优点。本文鉴于作者水平有限,文中如有错误之处还望指正。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7.3 详解NiN模型--首次使用多层感知机(1x1卷积核)替换掉全连接层的模型

一.前提知识 多层感知机&#xff1a;由一个输入层&#xff0c;一个或多个隐藏层和一个输出层组成。&#xff08;至少有一个隐藏层&#xff0c;即至少3层&#xff09; 全连接层&#xff1a;是MLP的一种特殊情况&#xff0c;每个节点都与前一层的所有节点连接&#xff0c;全连接…

设计模式(6)原型模式

一、介绍 Java中自带的原型模式是clone()方法。该方法是Object的方法&#xff0c;native类型。他的作用就是将对象的在内存的那一块内存数据一字不差地再复制一个。我们写简单类的时候只需要实现Cloneable接口&#xff0c;然后调用Object::clone方法就可实现克隆功能。这样实现…

emqx-5.1.4开源版使用记录

emqx-5.1.4开源版使用记录 windows系统安装eqmx 去官网下载 emqx-5.1.4-windows-amd64.zip&#xff0c;然后找个目录解压 进入bin目录,执行命令启动emqx 执行命令 emqx.cmd start使用emqx 访问内置的web管理页面 浏览器访问地址 http://localhost:18083/#/dashboard/overv…

猿人学刷题系列(第一届比赛)——第二题( js 混淆 - 动态cookie 1)

题目&#xff1a;提取全部5页发布日热度的值&#xff0c;计算所有值的加和 地址&#xff1a;https://match.yuanrenxue.cn/match/2 思路分析 本题我们会简单说一下两种不同的方式去处理&#xff0c;一种是不还原混淆代码直接从源代码硬扣生成逻辑&#xff0c;另一种则是还原…

数据通信——VRRP

引言 之前把实验做了&#xff0c;结果发现我好像没有写过VRRP的文章&#xff0c;连笔记都没记过。可能是因为对STP的记忆&#xff0c;导致现在都没忘太多。 一&#xff0c;什么是VRRP VRRP全名是虚拟路由冗余协议&#xff0c;虚拟路由&#xff0c;看名字就知道这是运行在三层接…

C语言三子棋小游戏--数组的应用

注&#xff1a;在最后面&#xff0c;完整源码会以两种形式展现。在讲解时&#xff0c;以三个源文件的形式。 前言&#xff1a;三子棋&#xff0c;顾名思义&#xff0c;就是三个子连在一起就可以胜出。在本节我们要介绍的三子棋模式是这样子的&#xff1a;在键盘输入坐标&#x…

HTML详解连载(3)

HTML详解连载&#xff08;3&#xff09; 专栏链接 [link](http://t.csdn.cn/xF0H3)下面进行专栏介绍 开始喽表单作用使用场景 input标签基本使用示例type属性值以及说明 input标签占位文本示例注意 单选框 radio代码示例 多选框-checkbox注意代码示例 文本域作用标签&#xff1…

【前端 | CSS】flex布局

基本概念 Flexible模型&#xff0c;通常被称为 flexbox&#xff0c;是一种一维的布局模型。它给 flexbox 的子元素之间提供了强大的空间分布和对齐能力 我们说 flexbox 是一种一维的布局&#xff0c;是因为一个 flexbox 一次只能处理一个维度上的元素布局&#xff0c;一行或者…

R语言4_安装BayesSpace

环境Ubuntu22/20, R4.1 你可能会报错说你的R语言版本没有这个库&#xff0c;但其实不然。这是一个在Bioconductor上的库。 同时我也碰到了这个问题&#xff0c;ERROR: configuration failed for package systemfonts’等诸多类似问题&#xff0c;下面的方法可以一并解决。 第…

Mr. Cappuccino的第61杯咖啡——Spring之BeanPostProcessor

Spring之BeanPostProcessor 概述基本使用项目结构项目代码运行结果源代码 常用处理器项目结构项目代码执行结果 概述 BeanPostProcessor&#xff1a;Bean对象的后置处理器&#xff0c;负责对已创建好的bean对象进行加工处理&#xff1b; BeanPostProcessor中的两个核心方法&am…

[内网渗透]CFS三层靶机渗透

文章目录 [内网渗透]CFS三层靶机渗透网络拓扑图靶机搭建Target10x01.nmap主机探活0x02.端口扫描0x03.ThinkPHP5 RCE漏洞拿shell0x04.上传msf后门(reverse_tcp)反向连接拿主机权限 内网渗透Target2&#xff08;1&#xff09;路由信息探测&#xff08;2&#xff09;msf代理配置&a…

LeetCode150道面试经典题--找出字符串中第一个匹配项的下标(简单)

1.题目 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 2.示例 3.思路 回溯算法&#xff1a;首先将…

LeetCode[1122]数组的相对排序

难度&#xff1a;Easy 题目&#xff1a; 给你两个数组&#xff0c;arr1 和 arr2&#xff0c;arr2 中的元素各不相同&#xff0c;arr2 中的每个元素都出现在 arr1 中。 对 arr1 中的元素进行排序&#xff0c;使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现…

【mysql】MySQL CUP过高如何排查?

文章目录 一. 问题锁定二. QPS激增会导致CPU飘高三. 慢SQL会导致CPU飘高四. 大量空闲连接会导致CPU飘高五. MySQL问题排查常用命令 一. 问题锁定 通过top命令查看服务器CPU资源使用情况&#xff0c;明确CPU占用率较高的是否是mysqld进程&#xff0c;如果是则可以明确CUP飘高的原…

[ubuntu]创建root权限的用户 该用户登录后自动切换为root用户

一、创建新用户 1、创建新用户 sudo useradd -r -m -s /bin/bash 用户名 # -r&#xff1a;建立系统账号 -m&#xff1a;自动建立用户的登入目录 -s&#xff1a;指定用户登入后所使用的shell2、手动为用户设置密码 passwd 用户名 二、为用户增加root权限 1、添加写权限 ch…

【redis基础】

目录 一、概述 1.NoSQL 1.1 简述 1.2 类型 1.3 应用场景 1.3.1 缓存 1.3.2 分布式锁 1.3.3 计数器 1.3.4 会话管理 1.3.5 消息队列 2.Redis 2.1 简述 2.2 特性 2.3 监听端口号 2.4 数据类型 二、安装 1.编译安装 2.RPM安装 三、目录结构 1.查看 2.主配置文…

[保研/考研机试] KY163 素数判定 哈尔滨工业大学复试上机题 C++实现

题目链接&#xff1a; 素数判定https://www.nowcoder.com/share/jump/437195121691718831561 描述 给定一个数n&#xff0c;要求判断其是否为素数&#xff08;0,1&#xff0c;负数都是非素数&#xff09;。 输入描述&#xff1a; 测试数据有多组&#xff0c;每组输入一个数…

[Docker实现测试部署CI/CD----构建成功后钉钉告警(7)]

目录 15、钉钉告警创建项目群&#xff0c;然后添加机器人添加机器人Jenkins 系统配置项目配置修改Jenkinsfile文件&#xff0c;添加钉钉提示信息测试 不修改Jenkinsfile文件&#xff0c;添加钉钉提示信息测试 15、钉钉告警 创建项目群&#xff0c;然后添加机器人 首先需要在钉…

搭建 Python 环境 | Python、PyCharm

计算机 计算机能完成的工作&#xff1a; 算术运算逻辑判断数据存储网络通信…更多的更复杂的任务 以下这些都可以称为 “计算机”&#xff1a; 一台计算机主要由以下这几个重要的组件构成 CPU 中央处理器&#xff1a;大脑&#xff0c;算术运算&#xff0c;逻辑判断 存储器&…

CSS 的选择器有哪些种类?分别如何使用?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 元素选择器&#xff08;Element Selector&#xff09;⭐ 类选择器&#xff08;Class Selector&#xff09;⭐ ID 选择器&#xff08;ID Selector&#xff09;⭐ 后代选择器&#xff08;Descendant Selector&#xff09;⭐ 子元素选择器&a…