如何描述自己的算法?

算法的表达

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

自然语言

先看一个例子,用自然语言描述从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语言实现》

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

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

相关文章

106短信群发平台在金融和法务行业的应用分析

一、金融行业应用 1.客户通知与提醒&#xff1a;银行、证券、保险等金融机构经常需要向客户发送各类通知和提醒&#xff0c;如账户余额变动、交易确认、扣费通知、理财产品到期提醒等。106短信群发平台可以快速、准确地将这些信息发送到客户的手机上&#xff0c;确保客户及时获…

.NET邮箱API发送邮件的步骤?怎么配置API?

.NET邮箱API发送邮件需要注意哪些&#xff1f;如何使用API发信&#xff1f; 在.NET环境中&#xff0c;使用邮箱API发送邮件是一个常见的需求。无论是企业级的邮件通知&#xff0c;还是个人项目中的邮件验证&#xff0c;都少不了.NET邮箱API的帮助。下面&#xff0c;AokSend将详…

我的创作纪念日(365天)

时间如白驹过隙&#xff0c;转眼间&#xff0c;我已经在技术写作这条路上走过了365个日夜。回望2023年5月9日&#xff0c;我敲下了第1篇技术博客的标题——《什么是代理IP&#xff1f;代理IP有什么用途》。那一天&#xff0c;平凡而又不平凡&#xff0c;因为我决定将自己的知识…

政安晨【零基础玩转各类开源AI项目】:基于Ubuntu系统本地部署使用GPT-SoVITS进行语音克隆与TTS语音生成

目录 介绍 什么是TTS 安装Miniconda 框架功能 测试通过的环境 开始 1. 安装好miniconda 2. 进入下载的GPT-SoVITS目录 3. 创建虚拟环境并执行脚本 4. 执行过程中可能会出错 5. 下载预训练模型 6. 训练过程中可能会报错 7. 使用过程中可能出错 8.以下是使用全过程…

信息安全管理体系介绍(含全套体系文档)

信息安全管理体系英文全称Information Security Management System&#xff0c;简称为ISMS&#xff0c;是1998年左右从英国发展起来的信息安全领域中的一个全新概念&#xff0c;是管理体系&#xff08;Management System&#xff0c;MS&#xff09;思想和方法在信息安全领域的应…

Flask-大体了解介绍

初识Flask Flask是使用 Python编写的Web微框架。Web框架可以让我们不用关心底层的请求响应处理&#xff0c;更方便高效地编写Web程序。 Flask主要有两个依赖&#xff0c;一个是WSGI&#xff08;Web Server Gateway Interface&#xff0c;Web服务器网关接口&#xff09;工具集…

探索大语言模型在信息提取中的应用与前景

随着人工智能技术的快速发展&#xff0c;大语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了显著的进展。特别是在信息提取&#xff08;IE&#xff09;任务中&#xff0c;LLMs展现出了前所未有的潜力和优势。信息提取是从非结构化文本…

ChatGPT-Next-Web漏洞利用分析(CVE-2023-49785)

1. 漏洞介绍 ​ 日常网上冲浪&#xff0c;突然粗看以为是有关Chat-GPT的CVE披露出来了&#xff0c;但是仔细一看原来是ChatGPT-Next-Web的漏洞。漏洞描述大致如下&#xff1a;&#xff08;如果有自己搭建了还没更新的速速修复升级防止被人利用&#xff0c;2.11.3已经出来了&am…

解决ModuleNotFoundError: No module named ‘skfuzzy‘,这个库全名可不叫skfuzzy哦,否则直接报错!!

ModuleNotFoundError: No module named skfuzzy 在这里插入图片描述在这里插入图片描述如何解决 ModuleNotFoundError: No module named skfuzzy 的问题&#xff1f;skfuzzy 模块介绍什么是模糊C均值聚类&#xff1f;skfuzzy 的应用如何使用 skfuzzy 进行模糊聚类 结论 如何解决…

数据结构-线性表-应用题-2.2-14

1&#xff09;算法基本设计思想&#xff1a; 2&#xff09;c语言描述&#xff1a; #define INT_MAX 0X7FFFFFFF int abs_(int a) {//绝对值if(a<0) return -a;else return a; } bool min(int a,int b,int c){if(a<b&&a<c) return true;else return false; } …

JAVA随记——集合篇

注意&#xff1a;作者之前的Java基础没有打牢&#xff0c;有一些知识点没有记住&#xff0c;所以在学习中出现了许多零散的问题。现在特地写一篇笔记总结一下&#xff0c;所以有些知识点不是很齐全。 集合中各类名词的关系 Collection集合为单列集合。 集合存储数据类型的特点…

案例导入说明.md

案例导入说明 为了演示多级缓存&#xff0c;我们先导入一个商品管理的案例&#xff0c;其中包含商品的CRUD功能。我们将来会给查询商品添加多级缓存。 1.安装MySQL 后期做数据同步需要用到 MySQL 的主从功能&#xff0c;所以需要大家在虚拟机中&#xff0c;利用 Docker 来运行一…

即将开幕,邀您共赴创新之旅“2024上海国际消费者科技及创新展览会”

备受期待的2024上海国际消费者科技及创新展览会&#xff08;以下简称“CTIS”&#xff09;即将于6月13日至15日亮相上海新国际博览中心N1-N3馆。 2024上海国际消费者科技及创新展览会总面积达40,000平方米&#xff0c;涵盖600余家展商&#xff0c;预计吸引40,000多位观众莅临现…

js原生写一个小小轮播案例

先上示例&#xff1a; 附上代码 html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content…

陪诊系统|陪诊小程序成品|陪诊系统功能

随着人们对健康的日益关注以及医疗技术的不断进步&#xff0c;陪诊小程序应运而生&#xff0c;通过提供陪同就医、医疗服务和健康管理等功能为患者和家庭成员提供了更多的便利和选择。本文将分析陪诊小程序的关键功能&#xff0c;以便更好地理解其在医疗领域的作用。 在陪诊小程…

SpringBoot过滤器简单构建详细教程以及与拦截器区别解释

作用范围&#xff1a;过滤器基于Servlet规范&#xff0c;作用于更广泛的层面&#xff0c;不仅限于Spring MVC&#xff0c;它可以拦截进入Web应用的所有请求&#xff0c;包括静态资源请求。过滤器可以对请求和响应的内容进行预处理和后处理。实现方式&#xff1a;过滤器需要实现…

iPhone 数据恢复软件 – 恢复丢失的 iPhone 数据

恢复丢失的 iPhone 数据&#xff0c;奇客数据恢复iPhone版。如今的 iPhone 用户在他们的设备上存储了大量数据&#xff0c;从照片和与亲人的文本对话到商业和医疗信息。其中一些是保密的&#xff1b;其中大部分内容都是非常个人化的&#xff1b;而且大多数一旦丢失就无法替代。…

4G水电燃气表定时拍照云端识别抄表仪器

通信方式&#xff1a;4G全网通 通信频段&#xff1a;B1/B3/B5/B8/B34/B38/B39/B40/B41 传输速率&#xff1a;最大10Mbps(DL)/最大5Mbps(UL) 传输功率&#xff1a;≤23dBm2dB 图片尺寸&#xff1a;640*480 JPG 图片大小&#xff1a;10~20K 光源条件&#xff1a;自带补光&a…

很好的Baidu Comate,使我的编码效率飞起!

文章目录 背景及简单介绍Baidu Comate安装功能演示总结 &#x1f381;写在前面&#xff1a; 观众老爷们好呀&#xff0c;这里是前端小刘不怕牛牛频道&#xff0c;今天牛牛在论坛发现了一款便捷实用的智能编程助手&#xff0c;就是百度推出的Baidu Comate。下面是Baidu Comate评…

html--互动星空

<!doctype html> <html> <head> <meta charset"utf-8"> <title>互动星空</title><style> html,body {margin:0;overflow:hidden;width:100%;height:100%;cursor:none;background:black;background:linear-gradient(to bot…