如何描述自己的算法?

news2024/12/24 21:56:29

算法的表达

好的,让我们来一起探讨如何向别人介绍我们的算法。说话很简单,但要把话说清楚,说明白就不那么容易了。同样的道理,能够通俗易懂,直观清晰和严谨地描述一个算法,也是一项具有挑战性的任务。接下来,让我们一起尝试,用生动有趣的方式,让算法的表达更加清晰易懂。

自然语言

先看一个例子,用自然语言描述从1开始的连续N个奇数求和的算法。
(1)确定一个N值。
(2)初始化总和sum=0,第一个奇数i=1。
(3)如果i<=N时候,执行第四步,否则执行第七步。
(4)总和sum自身加上i的值。
(5)i自身加上2。
(6)重新执行第三步。
(7)输出总和sum的值,算法结束。

从上面的描述中,我们可以发现用自然语言来阐述算法其实相当直接,就像是编写操作指南,一步步把过程详细列出。但这种方法也有它的短板:它往往不够简洁,而且由于每个人的表达习惯和方式不同,容易造成混淆和误解。所以,我们需要找到一种更加精确、统一的方式来描述算法,这样才能确保我们的算法被正确理解和执行。

流程图

首先来看流程图是怎样描述上面的例子,如图所示。

图1-2  流程图
流程图的优势是形象直观,容易理解。另外大家要注意,流程图里面的矩形,菱形不是随意画的,每一个图形都有特定的意思,这样的设计能够避免歧义。下图列举了常用流程图图标的意义。
在这里插入图片描述
一般流程图我们可以用Word,PPT等办公软件去画,如果要画较复杂的流程图,建议使用专门的软件去设计。例如微软的Visio,也可以使用在线应用,如processon等。

伪代码

伪代码是一种超级实用的工具,它是用类似英语的句子和简单的符号来搭建起自然语言与计算机语言之间的桥梁。通常情况下,程序员会在真正开始敲代码之前,用伪代码来梳理他们的思路。拿上面的例子来说,用伪代码来描述的话,大概会是这个样子:
(1)Begin(程序开始)。
(2)input(输入)N。
(3)sum=0;i=1。
(4)while(如果)i<=N。
(5)begin(开始循环)。
(6)sum=sum+i;i=i+2。
(7)end while (结束循环)。
(8)output(输出)sum。
(9)End(结束程序)。

从上面例子可以看到,伪代码已经非常接近代码了,多在技术文档和科学出版物中出现,非常直观清晰地表达程序员的想法。由于没有固定程序语言的形式限制,这样可以让使用不同编程语言的程序员都能理解。

练手:这个月有多少天

下面使用自然语言和流程图来描述求解某个月份有多少天的算法。我们知道每个月的天数变动有以下6个规律。
(1)有31天的月份有:1,3,5,7,8,10,12。
(2)有30天的月份有:4,6,9,11。
(3)闰年2月是29天。
(4)非闰年2月是28天。
(5)闰年是一般年份能被4整除,如1996年是闰年,1997不是闰年。
(6)世纪闰年的年份能被400整除,如1900年不是世纪闰年,2000年是世纪闰年。

首先我们使用自然语言来描述这个算法。
(1)输入年份year和月份month。
(2)如果year>0并且1<=month<=12,进行第(3)步,否则到第(12)步。
(3)如果month是1,3,5,7,8,10,12,进行第四步,否则到第(5)步。
(4)输出31天。
(5)如果month是4,6,9,11,进行第(6)步,否则到第(7)步。
(6)输出30天。
(7)如果year整除100,进行第(8)步,否则到第(11)步。
(8)如果year整除400,那么到第(9)步,否则到第(10)步。
(9)输出29。
(10)输出28。
(11)如果year整除4,那么到第(9)步,否则到第(10)步。
(12)输出“输入有误”。

然后通过流程图来描述算法,具体如图所示。
在这里插入图片描述
有兴趣的读者可以尝试用程序去实现这个算法。在Python里面有标准库calendar模块,专门解决日期问题,可以用它来验证算法是否正确。

import calendar
print(calendar.monthrange(2000,2)[1])  # 输出 29
print(calendar.monthrange(1999,2)[1])  # 输出28
print(calendar.monthrange(2019,7)[1])  # 输出31

更多内容

想获取完整代码或更多相关图的算法内容,请查看我的书籍:《数据结构和算法基础Python语言实现》

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

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

相关文章

Spring Gateway的核心功能:路由、过滤、限流一网打尽

Spring Gateway的简介 在微服务架构的世界里&#xff0c;如同繁星点点的服务需要一个指挥家&#xff0c;将它们有序地组织起来&#xff0c;让它们能够和谐地协同工作。这个指挥家&#xff0c;就是Spring Gateway。它是一个基于Spring Framework 5、Project Reactor和Spring Bo…

气膜体育馆可容纳多大的范围?—轻空间

气膜体育馆是一种创新的建筑形式&#xff0c;其可容纳的范围因其特殊的结构设计而具有灵活性和广泛性。那么&#xff0c;气膜体育馆到底可以容纳多大的范围呢&#xff1f; 首先&#xff0c;气膜体育馆的设计和建造通常可以根据场地的需求进行量身定制。由于气膜结构不需要钢结构…

轻松搞定!png格式图片怎么弄?详细方法一网打尽

在数字图像处理的日常应用中&#xff0c;PNG格式因其高质量的图像和支持透明背景的特性而备受青睐。然而&#xff0c;对于一些刚刚接触这一格式的用户&#xff0c;或者在处理PNG图片时遇到一些挑战的用户来说&#xff0c;如何轻松而有效地处理这种格式的图像可能是个问题。png格…

档案数字化电子文件检测工具

在档案数字化的过程中&#xff0c;需要注意扫描的电子文件属性和质量是否符合要求。nhdeep电子文件属性检测工具&#xff0c;支持对图片、pdf和ofd文件&#xff0c;显示文件的基本属性&#xff1a;文件类型、文件大小、创建时间&#xff1b;采集文件的分辨率、图片颜色、图片的…

element-plus el-cascader 懒加载实现-省市区街道选择及回显

大概思路&#xff1a; 准备一个接口可以通过父Id,查询到下一级省市区街道的信息&#xff1b;如下方的getRegionListOne确定后端的数据结构&#xff0c;需要在created里边处理数据回显逻辑el-cascader接收的数据格式是[‘’,‘’,‘’];后端的数据格式多为[{provinceId: ‘’, …

邮件群发系统的效率怎么样?如何评估性能?

邮件群发系统的使用方法&#xff1f;邮件群发工具的关键功能&#xff1f; 邮件群发系统已成为企业、组织及个人进行信息沟通的重要工具。然而&#xff0c;当我们谈论邮件群发系统的效率时&#xff0c;我们需要从多个维度来全面分析和评估。AokSend就来介绍一下。 邮件群发系统…

(图论)最短路问题合集(包含C,C++,Java,Python,Go)

不存在负权边&#xff1a; 1.朴素dijkstra算法 原题&#xff1a; 思路&#xff1a;&#xff08;依然是贪心的思想&#xff09; 1.初始化距离&#xff1a;dis[1]0&#xff0c;dis[i]INF&#xff08;正无穷&#xff09; 2.循环n次&#xff1a; 找到当前不在s中的dis最小的点&…

实现左上角的固定视口但是网格以图片中心放大缩小

仅仅修改了showbk&#xff08;&#xff09; 函数部分&#xff0c;增加bkv4 直接采样&#xff0c;然后粘贴到左上角&#xff0c;实现多余部分裁剪&#xff0c;形成视口内放大缩小 // 程序&#xff1a;2D RPG 地图编辑器与摄像机追随 // 作者&#xff1a;bilibili 民用级脑的研发…

nestjs版若依全栈管理后台完全开源!

hello&#xff0c;大家好&#xff0c;我是徐小夕。之前和大家分享了很多可视化&#xff0c;零代码和前端工程化的最佳实践&#xff0c;今天继续和大家分享一下我们小伙伴开源的基于 nestjs 的若依全栈管理系统。 相信前端小伙伴对若依管理系统并不陌生&#xff0c;它的后端采用…

短视频矩阵系统源码saas开发--可视化剪辑、矩阵托管、多功能合一开发

短视频矩阵系统源码saas开发&#xff08;可视化剪辑、矩阵托管、智能私信聚合、线索转化、数据看板、seo关键词、子账号等多个板块开发&#xff09; 短视频矩阵系统是一种集成了多种功能的系统&#xff0c;旨在帮助用户在短视频平台上进行高效的内容创作、管理和发布。根据您提…

Mysql 基础 order by ,as ,limit,case,asc、desc

order by 、as 、limit 、asc&#xff08;ascending 正序 默认&#xff09; desc&#xff08;descending 倒序&#xff09; SELECT 学号, 姓名, 成绩, CASEWHEN 成绩 > 90 THEN 优秀WHEN 成绩 > 80 THEN 良好WHEN 成绩 > 60 THEN 及格ELSE 不及格 END as 成绩级别 FRO…

一些js的基础

五大主流浏览器 内核 IE trident chrome webkit blink safari webkit firefox gecko opera presto ECMA European Computer Manufactures Association 欧洲计算机制造联合会 评估、开发 认可电信、计算机标准 ECMA-262 脚本语言的规范 ECMAScript 编程语言 1、编译型 翻译…

Android bootchart 分析启动性能工具使用

bootchart简介 bootchart 可为整个系统提供所有进程的 CPU 和 I/O 负载细分。该工具不需要重建系统映像&#xff0c;可以用作进入 systrace 之前的快速健全性检查。 1. 板端配置&#xff1a; 在Android 板端启用 bootchart&#xff0c;请运行以下命令&#xff1a; 2. Bootch…

Java 【数据结构】 TreeSetTreeMap(二叉搜索树详解)【神装】

登神长阶 第八神装 TreeSet 第九神装 TreeMap 目录 &#x1f489; 一.二叉搜索树 &#x1fa78;1. 定义 &#x1f48a;2. 基本操作 &#x1fa79;3. 插入操作 &#x1fa7c;4. 查找操作 &#x1fa7a;5. 删除操作* &#x1fa7b;6. 遍历操作 &#x1fa92;7.性能分析 …

使用固定公网地址远程访问开源服务器运维管理面板1Panel管理界面

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

Garden Planner for Mac v3.8.62注册激活版:园林绿化设计软件

Garden Planner for Mac是一款专为苹果Mac OS平台设计的园林景观设计软件。这款软件的主要功能是帮助用户设计梦想中的花园&#xff0c;包括安排植物、树木、建筑物和其他物体。 Garden Planner for Mac提供了一个包含1200多种植物和物体符号的库&#xff0c;这些符号都可以进行…

C语言——文件描述符、系统调用操作文件

文件描述符 在Unix-like操作系统中&#xff0c;文件描述符&#xff08;file descriptor&#xff09;是一个用于标识打开文件或I/O设备的整数值。它是对底层文件系统的抽象&#xff0c;用于在应用程序和操作系统之间传递文件信息。 文件描述符是一个非负整数&#xff0c;通常是…

这个Python库Streamlit,5分钟内搭建可视化WEB应用

在数据科学的世界里&#xff0c;将分析结果快速、直观地呈现给非技术背景的决策者&#xff0c;是一项重要的技能。而Streamlit&#xff0c;这个开源的Python库&#xff0c;正是为此而生。它允许数据科学家和工程师通过少量的代码&#xff0c;快速创建和分享数据应用。今天&…

用HAL库改写江科大的stm32入门例子_9-1 串口发送

设置串口&#xff1a; 选项说明&#xff1a; 写一个串口发送函数&#xff1a; // serial send string function void serial_send_string(char *str) {HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), 1000); } main函数中调用发送信息&#xff1a; uint8_t dat…

AIGC实战——多模态模型DALL.E 2

AIGC实战——多模态模型DALL.E 2 0. 前言1. 模型架构2. 文本编码器3. CLIP4. 先验模型4.1 自回归先验模型4.2 扩散先验模型 5. 解码器5.1 GLIDE5.2 上采样器 6. DALL.E 2 应用6.1 图像变体6.2 先验模型的重要性6.3 DALL.E 2 限制 小结系列链接 0. 前言 DALL.E 2 是 OpenAI 设计…