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

杨辉三角

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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式 - 消息队列Kafka:Kafka消费者的分区分配策略

文章目录 1. 环境准备2. range 范围分区策略介绍3. round-robin 轮询分区策略4. sticky 粘性分区策略5. 自定义分区分配策略 1. 环境准备 创建主题 test 有5个分区&#xff0c;准备 3 个消费者并进行消费&#xff0c;观察消费分配情况。然后再停止其中一个消费者&#xff0c;再…

fastadmin 自定义搜索分类和时间范围

1.分类搜索&#xff0c;分类信息获取----php 2.对应html页面&#xff0c;页面底部加搜索提交代码&#xff08;这里需要注意&#xff1a;红框内容&#xff09; 图上代码----方便直接复制使用 <script id"countrySearch" type"text/html"><!--form…

python之matplotlib入门初体验:使用Matplotlib进行简单的图形绘制

目录 绘制简单的折线图1.1 修改标签文字和线条粗细1.2 校正图形1.3 使用内置样式1.4 使用scatter()绘制散点图并设置样式1.5 使用scatter()绘制一系列点1.6 python循环自动计算数据1.7 自定义颜色1.8 使用颜色映射1.9 自动保存图表练习题 绘制简单的折线图 绘制一个简单折线图…

GPT-3.5 人工智能还是人工智障?——西红柿炒钢丝球!!

人工智能还是人工智障&#xff1f;——西红柿炒钢丝球 西红柿炒钢丝球的 基本信息西红柿炒钢丝球的 详细制作方法材料步骤 备注幕后花絮。。。。。。。。。关于GPT-3.5&#xff0c;你的看法&#xff1a; 西红柿炒钢丝球的 基本信息 西红柿炒钢丝球是一道具有悠久历史的传统中式…

springboot汽车租赁后台java出租客户管理jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 springboot汽车租赁后台 系统有1权限&#xff1a;管理…

阿里巴巴面试题---考察对底层源代码的熟悉程度

题目如图所示: 很多人可能会觉得两个输出都会是false,因为我们都会觉得""比较的是引用类型的地址,虽然放入的值都一样但是重新创造了新对象,地址不一样,所以结果都是false. 然而,当我们运行程序会发现结果都是false. 下面,我们来分析为什么是这样的结果. 我们知道…

OneFlow 中的 Softmax

Softmax 是深度学习模型中的常见算子。PyTorch 的 Softmax 算子直接调用 cuDNN 的接口。而 OneFlow 内部针对输入数据的类别数量&#xff0c;采用3个 kernel 来分别处理&#xff0c;在多数情况下都可以获得比 cuDNN 更优的性能表现。测试结果可见 如何实现一个高效的Softmax CU…

未来混合动力汽车的发展:技术探索与前景展望

随着环境保护意识的增强和对能源消耗的关注&#xff0c;混合动力汽车成为了汽车行业的研发热点。混合动力汽车融合了传统燃油动力和电力动力系统&#xff0c;通过优化能源利用效率&#xff0c;既降低了燃油消耗和排放&#xff0c;又提供了更长的续航里程。本文将探讨混合动力汽…

配置docker,案例复现

配置docker(系统为centos) 1.检查操作系统环境: docker要求CentOS系统的内核版本高于 3.10 &#xff0c;通过 uname -r 命令查看你当前的内核版本是否支持安装docker 2.查看你是否拥有旧的版本&#xff0c;有的话卸载&#xff0c;没有的话直接略过该步骤 sudo yum remove d…

【快应用】list组件属性的运用指导

【关键词】 list、瀑布流、刷新、页面布局 【问题背景】 1、 页面部分内容需要瀑布流格式展示&#xff0c;在使用lsit列表组件设置columns进行多列渲染时&#xff0c;此时在里面加入刷新动画时&#xff0c;动画只占了list组件的一列&#xff0c;并没有完全占据一行宽度&…

“解锁IDEA的潜力:高级Java Maven项目配置指南”

目录 前言&#xff1a;流程目录&#xff1a;1.确保Java和Maven已安装检查Java是否已正确安装并配置环境变量 2.创建一个新的Maven项目导航到要创建项目的目录配置Maven运行以下命令创建一个新的Maven项目 3.配置项目的pom.xml文件打开项目根目录下的pom.xml文件配置Web.xml 4.配…

案例13 Spring MVC参数传递案例

基于Spring MVC实现HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON方式的参数传递。 1. 创建项目 选择Maven快速构建web项目&#xff0c;项目名称为case13-springmvc02。 2. 配置Maven依赖 <?xml version"1.0" encoding"UTF-8&quo…

Vue2(生命周期,列表排序,计算属性和监听器)

目录 前言一&#xff0c;生命周期1.1&#xff0c;生命周期函数简介1.2&#xff0c;Vue的初始化流程1.3,Vue的更新流程1.4&#xff0c; Vue的销毁流程1.5&#xff0c; 回顾生命周期1.,6&#xff0c;代码演示1.6-1&#xff0c;beforeCreate1.6-2&#xff0c;created1.6-3&#xf…

9.2.1Socket(UDP)

一.传输层: 1.UDP:无连接,不可靠,面向数据报,全双工. 2.TCP:有连接,可靠,面向字节流,全双工. 注意:这里的可不可靠是相对的,并且和安不安全无关. 二.UDP数据报套接字编程: 1.socket文件:表示网卡的这类文件. 2.DatagramPacket:表示一个UDP数据报. 三.代码实现: 1.回显服务…

Linux系列:从0到1用Docker部署springboot项目

目录 1.前提条件 2.编写DockerFile镜像文件 3.打包SpringBoot项目 4.通过软件Xftp进行传输&#xff08;*&#xff09; 1.点击“文件-新建”​编辑 5.操作远程主机 1.docker构建 2.容器运行 6.容器的关闭和删除 1.前提条件 Linux、docker、xftp的安装、一台可以访问的远…

自动驾驶——驶向未来的革命性技术

自动驾驶——驶向未来的革命性技术 自动驾驶的组件自动驾驶的优势自动驾驶的应用自动驾驶的未来中国的自动驾驶 自动驾驶是一种技术&#xff0c;它允许车辆在没有人类驾驶员的情况下自主地进行行驶。它利用各种传感器、计算机视觉、人工智能和机器学习算法来感知和理解周围环境…

Vim学习(三)—— Git Repo Gerrit

Git、Gerrit、Repo三者的概念及使用 三者各自作用&#xff1a; git&#xff1a;版本管理库&#xff0c;在git库中没有中心服务器的概念&#xff0c;真正的分布式。 repo&#xff1a;repo就是多个git库的管理工具。如果是多个git库同时管理&#xff0c;可以使用repo。当然使用…

Linux常见面试题,应对面试分享

操作系统基础 1.cpu占⽤率太⾼了怎么办? 排查思路是什么&#xff0c;怎么定位这个问题&#xff0c;处理流程 其他程序: 1.通过top命令按照CPU使⽤率排序找出占⽤资源最⾼的进程 2.lsof查看这个进程在使⽤什么⽂件或者有哪些线程 3.询问开发或者⽼⼤,是什么业务在使⽤这个进程…

期权定价模型系列【2】—期权的希腊字母计算及应用

本篇文章旨在介绍期权常见希腊字母的计算及应用 本专栏更多侧重于理论及文字方面的展示&#xff0c;文章具体的代码可以参考我的另一个专栏【期权量化】。 【期权量化】专栏有同名文章&#xff0c;并且给出了文章的具体代码。 专栏地址&#xff1a; http://t.csdn.cn/Y30Hk…

接口测试自动化:简化测试流程,提升效率

接口测试自动化&#xff1a;简化测试流程&#xff0c;提升效率 什么是接口测试自动化&#xff1f; 接口测试自动化是指使用特定的工具和技术来自动化执行接口测试的过程。通过编写脚本&#xff0c;自动化工具可以模拟用户与软件系统的交互&#xff0c;验证接口的功能和性能。…