杨辉三角形-第11届蓝桥杯选拔赛Python真题精选
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第17讲。
杨辉三角形,本题是2019年12月15日举办的第11届蓝桥杯青少组Python编程选拔赛真题,题目要求编写程序输出指定行数的杨辉三角形。
先来看看题目的要求吧。
一.题目说明
提示信息:
杨辉三角形,是二项式系数在三角形中的一种几何排列。中国南宋数学家杨辉在1261年所著的 《详解九章算法》一书有明确记载。欧洲数学家帕斯卡在1654年发现这一规律,所以又叫做帕斯卡三角形。
其定义为:其顶端(第1行)是1;第2行是两个1;第3行是'1 2 1',中间的'2'是其上方相邻的两个数字的和;依此类推,产生如图所示的杨辉三角形。
编程实现:
对于任意输入的3~15之间的正整数n,请编程输出前n行数字、以及由其组成的杨辉三角形。
函数提示:
print('{:< 3}'.format(10))能够以3个字符宽度、左对齐的方式显示数字10。
输入描述:
一个正整数n(2 ≤ n ≤ 15)
输出描述:
由两部分组成。第一部分输出由n行数字组成的列表;第二部分输出n行数字组成的杨辉三角形,具体输出格式参考如下样例。
样例输入:
6
样例输出:
评判标准:
下列各评分项单独计分,得分累加,共35个计分点。
-
15分:正确输出n行数字组成的列表;
-
9分:正确输出n行数字组成的杨辉三角形,输出格式不需要完全符合样例;
-
11分:正确输出n行数字组成的杨辉三角形,且格式符合样例,即要求各数字间距相同、左右对称、上下隔行对齐。
二.思路分析
这是一道算法题,考查的知识点主要包括循环、列表操作、输出控制和算法等。
你知道吗,中国古代数学史曾经有自己光辉灿烂的篇章,在数学的许多重要领域中处于遥遥领先的地位,杨辉三角形的发现就是十分精彩的一页。
要解决本题,首先需要找到这其中的规律,相信聪明的你已经发现了,杨辉三角形具有如下4个特性:
1). 第n行的数字有n个
2). 每行首位数字和末位数字都是1;
3). 每行中间的各项数字都是它肩上两个数字的和;
4). 第n行的项数总比第n-1行多1。
尤其是第3点,这是关键,我们可以结合动图来理解:
但是,我们的数据是保存在列表中的,将上图转换成规则的表格形式,如下:
这样看起来就比较清楚了,除了第1行和第2行之外,从第3行开始,每一行的中间项(除首尾两项)都满足如下公式:
a[i][j] = a[i-1][j-1] + a[i-1][j]
这里的i表示行,j表示列,其中,a[i-1][j-1]是左上方的列表项,a[i-1][j]是正上方的列表项。
这其实就是递推算法,那什么是递推算法呢?
递推算法是一种简单的算法,其核心思想是根据已有的数据和关系,逐步推导而得到结果。
递推算法的特点是,一个问题的求解需要一系列的计算,在已知条件和所求问题之间总存在着某种相互联系的关系,在计算时,需要找到前后项之间的关系,即推导公式。
根据上面的分析,我们可以将本题分成如下几步来实现:
-
初始化列表,包括前两行;
-
使用递推算法构造整个列表
-
输出列表
-
输出杨辉三角形
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们分4步来编写程序:
-
初始化列表;
-
使用递推算法构造整个列表
-
输出列表
-
输出杨辉三角形
1. 初始化列表
这一步,非常简单,只需要完成两个任务,一是获取用户输入的行数,二是创建一个二维列表,编写代码如下:
由于这里只需要初始化列表的前两项,所以在构造的时候直接写上即可,和行数n没有关系。
2. 使用递推算法构造整个列表
根据前面的思路分析,从第3行开始,使用递推算法逐步构造列表项,继续编写代码如下:
这部分代码是本题的关键,也是难点,重点说明一下。
由于列表的第1行和第2行已经有了,所以在循环的时候,i从2开始,表示第3行,到n-1行结束,包括第n-1行。
对于第i行,首先构造一个一维列表,并将所有的初始值设为1。
比如i = 2时,表示第3行,有3项数据,构造的列表为:
[1, 1, 1]
再如i = 3时,表示第4行,有4项数据,构造的列表为:
[1, 1, 1, 1]
又如i = 4时,表示第5行,有5项数据,构造的列表为:
[1, 1, 1, 1, 1]
将构造好的列表追加到tri列表中,然后使用循环,对中间项进行推导,所以变量j的范围是(1,i),第一项和最后一项则保持1不变。
3. 输出列表
列表构造完毕,直接使用for循环输出即可,代码如下:
4. 输出杨辉三角形
按照题目要求,需要输出三角形的形状,并且各数字间距相同、左右对称、上下隔行对齐,这个该怎么实现呢?
关于对齐效果,Python提供了center()函数,用法如下:
str.center(width[, fillchar])
其中,width表示字符串的总宽度,fillchar则表示填充字符,默认为空格。
有了这个函数,问题就变得简单了,只需要将数字转成字符串,然后调用center()方法即可,那么,这里的width设置多少比较合适呢?
题目中明确给出了n的取值范围为[2,15],当n=15时,最大的数字为3432,所以宽度必须要大于4,同时确保左右各空一格,所以设置为6比较合适。
然后就是每一行需要输出空格,空格的数量和行数有关系,以n=6为例,
根据上面的表格,我们可以总结出如下规律:
第1行,左边要空出5个单元格,即6 - 0 - 1
第2行,左边要空出4个单元格,即6 - 1 - 1
第3行,左边要空出3个单元格,即6 - 2 - 1
......
第i行,左边要空出n - i - 1个单元格
注意,这里的i是从0开始的。
所以,对于第i行而言,要输出的空格数为:
(n - i - 1) * 3
之所以乘以3,是因为每个数字的宽度为6,6/2 = 3。
分析完毕,就可以编写代码了,如下:
运行程序,输入数字6,效果如下:
再输入数字15,效果如下:
怎么样,对齐效果还是非常nice的吧,至此,整个程序就全部完成了,你也可以输入不同的数字来测试效果。
四.总结与思考
本题的分数为35分,代码在15行左右,涉及到的知识点包括:
-
循环语句,主要for...in循环;
-
列表运算,尤其是二维列表;
-
输出格式控制;
-
递推算法;
题目难度较大,尤其是对于初学者。难点有两个,一是如何找到杨辉三角数据之间的规律,这是实现递推算法的关键所在,二是如何使用二维列表来表示杨辉三角,并构造出列表。
考生除了要具备扎实的Python语法基础之外,同时还需要具备一定的算法思维,随着学习的不断深入,算法会变得越来越重要。
递推法是一种重要的数学方法,在数学的各个领域中都有广泛的运用,也是计算机用于数值计算的一个重要算法。这种处理问题的方法能将复杂运算简化为若干步重复的简单运算,充分发挥出计算机擅长于重复处理的特点。
使用递推算法,把一个复杂的问题的求解,分解成了连续的若干步简单运算,从这个角度来讲,可以将递推算法看成是一种特殊的迭代算法。
超平老师给你留一道思考题,除了上面讲到的方法外,还有没有其它的方法,具体又是如何实现的呢?
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要源码的,可以移步至“超平的编程课”gzh。
相关文章:

杨辉三角形-第11届蓝桥杯选拔赛Python真题精选
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第17讲。 杨辉三角形&#…...

我们一起做过的SPA——Nuxt.js介绍
Nuxt.js 1 我们一起做过的SPA SPA(single page web application)单页 Web 应用,Web 不再是一张张页面,而是一个整体的应用,一个由路由系统、数据系统、页面(组件)系统等等,组成的应…...

java导出word使用模版与自定义联合出击解决复杂表格!
1. 看一下需要导出什么样子的表格 如图所示,这里的所有数据行都是动态的,需要根据查询出来的数据循环展示。 如果只是这样的话,使用freemarker应该都可以搞定,但是他一列中内容相同的单元格,需要合并。 这对于表格样式…...
GO设计模式——9、过滤器模式(结构型)
目录 过滤器模式(Filter/Criteria Pattern) 代码实现 过滤器模式(Filter/Criteria Pattern) 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,…...
fastadmin 导出
php 接收数据 set_time_limit(0);ini_set(memory_limit, -1);$ids $this->request->post(ids);$filter $this->request->post(filter);$op $this->request->post(op);$search $this->request->post(search);$whereIds $ids all ? 11 : [id >…...

六、CM4树莓派USBRS转485串口通讯
一、串行通讯接口 串行通讯接口简称串口(UART) 采用串行通信方式的扩展接口,数据位一位一位的按照顺序传送 优点:通信线路简单,只要一对传输线就可以实现双向通信能够大大降低成本,适合远距离通信。 缺点…...

c++知识总结
一 细碎知识 1.27 # 1.27.1 # pragma once 参考 C++学习笔记之pragma once的理解_pragma once什么意思-CSDN博客https://blog.csdn.net/lynnlee_36/article/details/105322937作用 保证只被编译一次,和#ifndef,#define,#endif功能相同 1.27.2 #if defined(__cplusplus…...

python-爬取壁纸
代理池的,防止IP 被封 找到图片真实地址 现在看到的只是图片的预览地址 (previews) 1.检查: 2.鼠标变为箭头时查看网页源代码 关于怎样在源代码中找到图片的真实地址 ??? 为什么在源代码界面 ctrl f 时候搜索的是 .png ??? 首先图片地址是以 .j…...

第31期 | GPTSecurity周报
GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…...

湖仓一体架构理论与实践汇总
湖仓一体架构理论与实践汇总 软件研发本质上属于“手工业”。软件研发在很大程度上还是依赖于个人的能力。当软件规模较小时,依赖“手工业”可以解决问题,但是当软件规模大了之后再依赖“手工业”就不行了。 软件的复杂度包含两个层面:软件…...
Redission从入门到入门
1. Redisson简介 Redisson 是一个在 Java 环境中使用的 Redis 客户端库。它提供了丰富的功能,使得在 Java 应用中与 Redis 交互变得更加简单和高效。Redisson 不仅提供了基本的 Redis 操作,还提供了许多高级功能,使其成为在 Java 项目中实现…...

PHP对接企业微信
前言 最近在做项目中,要求在后台管理中有企业微信管理的相关功能。相关准备工作,需要准备好企业微信账号,添加自建应用,获得相应功能的权限,以及agentid、secre等。 参考文档: 企业微信开发文档 功能实现 因…...
【原创】录剪视频的折腾之路
制作视频的起因 本人为IT男,IT发展快,需要学习的东西又多。往往为了一个技术小问题,花好几天时间学习,接下来十来分钟把事情做完。下次遇到这个同样的问题的时候,可能是几个月后,甚至是几年以后了。这些技…...

【BI】FineBI功能学习路径-20231211
FineBI功能学习路径 https://help.fanruan.com/finebi/doc-view-1757.html 编辑数据概述 1.1 调整数据结构 1.2 简化数据 2.1上下合并 2.2其他表添加列 2.3左右合并 新增分析指标 函数参考 https://help.fanruan.com/finereport/doc-view-1897.html 数值函数 日期函数 文…...
pytorch之torch.utils.data学习
1、概述 PyTorch 数据加载利用的核心是torch.utils.data.DataLoader类 。它表示在数据集上 Python 可迭代,支持 map-style and iterable-style datasets(地图样式和可迭代样式数据集), customizing data loading orderÿ…...
Spring Boot 3中一套可以直接用于生产环境的Log4J2日志配置
文章目录 一 Log4J2 相关概念及基本特点二 Spring Boot3 中启用Log4J2的pom.xml配置三 application.properties 的配置四 完整配置 一 Log4J2 相关概念及基本特点 Log4J2是Apache Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题&…...

iOS按钮控件UIButton使用
1.在故事板中添加按钮控件,步聚如下: 同时按钮Shift+Commad+L在出现在控件库中选择Button并拖入View Controller Scene中 将控件与变量btnSelect关联 关联后空心变实心 如何关联?直接到属性窗口拖按钮变量到控件上,出现一条线,然后松开,这样就关联成功了 关联成功后属性窗口…...

小程序开发实战案例之三 | 小程序底部导航栏如何设置
小程序中最常见的功能就是底部导航栏了,今天就来看一下怎么设置一个好看的导航栏~这里我们使用的是支付宝官方小程序 IDE 做示范。 官方提供的底部导航栏 第一步:页面创建 一般的小程序会有四个 tab,我们这次也是配置四个 tab 的…...
Android : 序列化 JSON简单应用
1. JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和写入,同时也易于机器解析和生成。它基于JavaScript的子集,采用完全独立于语言的文本格式来存储和表示数据。JSON是纯文本&#x…...
Java小案例-RocketMQ的11种消息类型,你知道几种?(普通消息和批量消息)
前言 这篇给大家讲普通消息和批量消息,主要配合代码进行讲解,关于RocketMQ的基础知识已经在上篇给大家讲过需要回顾的点击下面这个链接去看 RocketMQ基础知识 普通消息 普通消息其实就很简单,是Apache RocketMQ中最基础的消息形式&#x…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...