<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>泡面编程 on 易哥</title>
		<link>https://yeecode.top/easyai/</link>
		<description>Recent content in 泡面编程 on 易哥</description>
		<generator>Hugo</generator>
		<language>zh-cn</language>
		
		
		
		
			<lastBuildDate>Thu, 17 Sep 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://yeecode.top/easyai/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>程序的语法</title>
				<link>https://yeecode.top/easyai/003/</link>
				<pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://yeecode.top/easyai/003/</guid>
				<description>&lt;blockquote&gt;&#xA;    &lt;p&gt;本节我们将掌握程序语法的概念，并真正定义几条语法规则。&lt;/p&gt;&#xA;&#xA;  &lt;/blockquote&gt;&lt;p&gt;人类的语言被称为“自然语言”，汉语、英语、日语都属于自然语言。&lt;/p&gt;&#xA;&lt;p&gt;我一岁半的儿子现在虽然还不会说，但是已经能够听懂不少话了。当我们问他：“你现在多沉了啊？”他就会屁颠屁颠地走到卧室，站到体重秤上，然后指着秤上的数字喊着“啊！啊！”的声音让我看。一岁半的婴儿就能够听懂，似乎人类的自然语言很简单，也很好理解。&lt;/p&gt;&#xA;&lt;p&gt;实际上，人类的自然语言是很复杂的且难以理解的，至少对于计算机看来是这样的。例如，针对同样的含义，使用自然语言可能会有不同的表述。例如下面的多行语句中，各行的表述不同，但表示的意思都是一样的。&lt;/p&gt;&#xA;&lt;center&gt;&#xA;&lt;p&gt;将方便面从袋子中取出，放到干净的碗中。&lt;/p&gt;&#xA;&lt;p&gt;把从袋子中取出来的方便面放到干净的碗中。&lt;/p&gt;&#xA;&lt;p&gt;在干净的碗中放入从袋子中取出的方便面。&lt;/p&gt;&#xA;&lt;/center&gt;&#xA;&lt;p&gt;并且人类对自然语言中错误的容忍性很高。有一个挺有趣的例子：&lt;/p&gt;&#xA;&lt;center&gt;&#xA;&lt;p&gt;研表究明，汉字的序顺不影阅响读。&lt;/p&gt;&#xA;&lt;/center&gt;&#xA;&lt;p&gt;上述话是乱序的，但是你也可以理解上面的意思，甚至在第一遍阅读时都没有发现错误之处。&lt;/p&gt;&#xA;&lt;p&gt;而计算机的本质是机器，很死板，所以写给他的语言必须要完全遵守约定好的规则。少些漏写哪怕一个字母、一个标点，计算机都会因为不认识而报错。所以我们上面列举这些情况，对于计算机而言过于复杂，很难理解。&lt;/p&gt;&#xA;&lt;p&gt;因此，使用人类的自然语言控制计算机并不是一个好的选择&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&#xA;&lt;p&gt;我们需要一种明确、易于被计算机接受的方式去控制计算机，于是就出现了“程序语言”。程序语言和自然语言相比，它有着严格的书写规则，这一套规则就是语法。&lt;/p&gt;&#xA;&lt;p&gt;就像是数学一样，数学就规定了一整套的规则：解答时，先用“解：”开始，用“∵”表示“因为”，用“∴”表示所以，用“∈”表示集合中的“属于”，用“∥”表示“平行”等等。并且数学中对每个符号的含义进行了明确的定义，例如，集合中“∈”的定义是：&lt;/p&gt;&#xA;&lt;center&gt;&#xA;如果a是集合A的元素，就说a属于集合A，记作a∈A。&#xA;&lt;/center&gt;&#xA;&lt;p&gt;这套规则使得数学成了一门十分严谨的科学，如图{@fig:shuxuejieti}所示，不同的人在阅读同一个数学证明时，就不会有歧义。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/003/pic/shuxuejieti_hu_d371a7d52e281559.webp&#34; alt=&#34;数学证明过程&#34; width=&#34;900&#34; height=&#34;600&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;{#fig:shuxuejieti}&lt;/p&gt;&#xA;&lt;p&gt;和计算机交流时，也要十分严谨，不能有歧义，因此和计算机交流要有明确的规则。刚刚我们已经说过，自然语言不是一种好的选择。流程图给出了一些标准的符号，比自然语言要严谨了一些，可画毕竟要比写麻烦不少，并不是特别适合用来编程&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;。十分有必要来定义一套新的规则，作为程序的语法。&lt;/p&gt;&#xA;&lt;p&gt;既然程序都是由顺序结构、选择结构、循环结构这三种结构组成的，那我们十分有必要先定义下它们的语法。&lt;/p&gt;&#xA;&lt;p&gt;提前说明一下，我们定义的语法中，凡是不带下划线的部分，都是语法规则设定的，这部分必须要一字不错，不能随意修改。凡是带有下划线的部分，是可以根据需要填入的。&lt;/p&gt;&#xA;&lt;p&gt;下面{@fig:shunxu_wei}左侧是顺序结构的流程图，右侧是对应的程序语法。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/003/pic/shunxu_wei.drawio_hu_7d3d40f394f1afdf.webp&#34; alt=&#34;顺序结构的流程图与程序语法&#34; width=&#34;836&#34; height=&#34;410&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; style=&#34;width: 45%;&#34;&gt;{#fig:shunxu_wei}&lt;/p&gt;&#xA;&lt;p&gt;顺序结构的程序语法非常简单，就是每一步占一行，依次向下写就好。&lt;/p&gt;&#xA;&lt;p&gt;那图{@fig:sx01}所示的泡面流程图中的顺序结构部分：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/003/pic/pm_lc0101.drawio_hu_ad38b4fe1c781ab.webp&#34; alt=&#34;泡面流程图中的顺序结构&#34; width=&#34;900&#34; height=&#34;387&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; style=&#34;width: 75%;&#34;&gt;{#fig:sx01}&lt;/p&gt;&#xA;&lt;p&gt;就可以用顺序结构的语法写出来：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;将方便面从袋子中取出，放到干净的600ml容量的空碗中。&#xA;取出一包调料包，拆开，将调料倒入上述碗中。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;下面{@fig:xuanze_wei}左侧是选择结构的流程图，右侧是对应的程序语法。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/003/pic/xuanze_wei.drawio_hu_de3866c3406dde02.webp&#34; alt=&#34;选择结构的流程图与程序语法&#34; width=&#34;900&#34; height=&#34;317&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;{#fig:xuanze_wei}&lt;/p&gt;&#xA;&lt;p&gt;这里注意的是，我们在定义语法时使用了缩进，输入四个空格就可以实现这样的缩进。当然，也有人习惯在键盘上按一下“Tab”键来代替四个空格，这也是可以的，我们不做强制要求，但是要求保持统一，不能两种混合使用。&lt;/p&gt;&#xA;&lt;p&gt;凡是缩进的内容，都属于该选项对应的操作，直到出现没有缩进的行为止。例如我们选择了“选项1”，那后面“选项1”对应的操作可以包含很多行，只要保持缩进就好，直到第一条没有缩进的语句出现的时候，表示“选项1”对应的操作结束了。&lt;/p&gt;&#xA;&lt;p&gt;那图{@fig:sx02}所示的泡面流程图中的选择结构部分：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/003/pic/pm_lc0102.drawio_hu_b04804b34ccfb8fb.webp&#34; alt=&#34;泡面流程图中的选择结构&#34; width=&#34;900&#34; height=&#34;523&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; style=&#34;width: 75%;&#34;&gt;{#fig:sx02}&lt;/p&gt;&#xA;&lt;p&gt;就可以用选择结构的语法写出来：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;若满足 喜欢硬的面 ：&#xA;    等待3分钟&#xA;否则若满足 喜欢软硬适中的面 ：&#xA;    等待4分钟&#xA;否则若满足 喜欢软的面 ：&#xA;    等待5分钟&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;下面{@fig:xunhuan_wei}左侧是循环结构的流程图，右侧是对应的程序语法。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/003/pic/xunhuan_wei.drawio_hu_2c1cf64be353cc3c.webp&#34; alt=&#34;循环结构的流程图与程序语法&#34; width=&#34;900&#34; height=&#34;679&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; style=&#34;width: 75%;&#34;&gt;{#fig:xunhuan_wei}&lt;/p&gt;&#xA;&lt;p&gt;这里同样也用到了缩进，缩进的内容都是属于循环的一部分，每一次循环中，都会将这些操作依次执行完，然后再回到最上面的判断部分，去判断是不是继续下一次执行。&lt;/p&gt;&#xA;&lt;p&gt;那图{@fig:sx03}所示的泡面流程图中的循环结构这部分：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/003/pic/pm_lc0103.drawio_hu_608b712a09d9b67d.webp&#34; alt=&#34;泡面流程图中的循环结构&#34; width=&#34;900&#34; height=&#34;381&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;{#fig:sx03}&lt;/p&gt;&#xA;&lt;p&gt;就可以用循环结构的程序语法写出来：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;当符合 还有调料包 ：&#xA;    取出一包调料包，拆开，将调料倒入上述碗中。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;掌握了三种结构的程序语法，接下来我们可以尝试将整个流程图都使用我们程序语法写出来。你可以先不看答案，尝试自己写一下，然后再和下面的答案作对比。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;将方便面从袋子中取出，放到干净的600ml容量的空碗中。&#xA;取出一包调料包，拆开，将调料倒入上述碗中。&#xA;当符合 还有调料包 ：&#xA;    取出一包调料包，拆开，将调料倒入上述碗中。&#xA;向碗中注入500ml温度为100℃的水，并立刻用直径大于碗的碟子盖住碗。&#xA;若满足 喜欢硬的面 ：&#xA;    等待3分钟&#xA;否则若满足 喜欢软硬适中的面 ：&#xA;    等待4分钟&#xA;否则若满足 喜欢软的面 ：&#xA;    等待5分钟&#xA;打开盖住碗的碟子。&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;好了，可以参照上面，看下自己写的对不对。&lt;/p&gt;</description>
			</item>
			<item>
				<title>流程图</title>
				<link>https://yeecode.top/easyai/002/</link>
				<pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://yeecode.top/easyai/002/</guid>
				<description>&lt;blockquote&gt;&#xA;    &lt;p&gt;本节我们了解编程过程中一个重要的工具——流程图。&lt;/p&gt;&#xA;&#xA;  &lt;/blockquote&gt;&lt;p&gt;现在，你的朋友应该正在泡方便面了。那我们也可以梳理下咱们的泡面算法了：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;第①步：将方便面从袋子中取出，放到干净的600ml容量的空碗中。&lt;/li&gt;&#xA;&lt;li&gt;第②步：取出调料包，拆开，将调料倒入上述碗中。&lt;/li&gt;&#xA;&lt;li&gt;第③步：检查是否还有调料包。如果有，重复第②步；如果没有，进入下一步。&lt;/li&gt;&#xA;&lt;li&gt;第④步：向碗中注入500ml温度为100℃的水，并立刻用直径大于碗的碟子盖住碗。&lt;/li&gt;&#xA;&lt;li&gt;第⑤步：如果喜欢硬一点的面，则等3分钟；如果喜欢软硬适中的面，则等4分钟；如果喜欢软一点的面，则等5分钟。&lt;/li&gt;&#xA;&lt;li&gt;第⑥步：时间一到就打开盖住碗的碟子，就可以吃面了。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;可以看出，整个算法的主体结构就是从第①步到第⑥步顺序执行，没什么难度。&lt;/p&gt;&#xA;&lt;p&gt;但是也有两处存在一些特殊的操作。&lt;/p&gt;&#xA;&lt;p&gt;最明显的是第⑤步，这里会根据朋友的选择，产生多种情况。&lt;/p&gt;&#xA;&lt;p&gt;还有第③步，这里如果有多个调料包，则要回到第②步。而如果方便面中的调料包很多的话，则会一直在②③步之间循环。直到所有的调料包都被拆完。&lt;/p&gt;&#xA;&lt;p&gt;以上，其实体现了三种结构：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;顺序结构：按照步骤顺序依次执行。&lt;/li&gt;&#xA;&lt;li&gt;选择结构：进行某些条件进行判断，并根据判断结果执行不同的步骤。&lt;/li&gt;&#xA;&lt;li&gt;循环结构：不断地重复一些步骤，直到最后满足一定条件后，才停止重复。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;以上这些结构也可以用图形表示出来，那样会更加直观一些。&lt;/p&gt;&#xA;&lt;p&gt;顺序结构最为简单，就是按照步骤顺序依次执行，如图{@fig:shunxu}所示。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/002/pic/shunxu.drawio_hu_9ed0acdf36caecf0.webp&#34; alt=&#34;顺序结构&#34; width=&#34;366&#34; height=&#34;356&#34; loading=&#34;eager&#34; decoding=&#34;async&#34; style=&#34;width: 25%;&#34;&gt;{#fig:shunxu}&lt;/p&gt;&#xA;&lt;p&gt;选择结构也不难，就是进行某些条件进行判断，并根据判断结果执行不同的步骤。如图{@fig:xuanze}所示，在图中的特点就是存在执行步骤的分叉。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/002/pic/xuanze.drawio_hu_3ff1dd6cfc71c8b8.webp&#34; alt=&#34;选择结构&#34; width=&#34;900&#34; height=&#34;563&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; style=&#34;width: 75%;&#34;&gt;{#fig:xuanze}&lt;/p&gt;&#xA;&lt;p&gt;循环结构稍微复杂一点，它同样存在一个判断模块，如果判断满足循环条件则继续循环，如果不满足循环条件，则跳出循环执行后面的步骤，如图{@fig:xunhuan}所示。要注意的是，每一次循环结束后，都会再判断一下是继续循环还是退出。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/002/pic/xunhuan.drawio_hu_38d6fc602eb19702.webp&#34; alt=&#34;循环结构&#34; width=&#34;756&#34; height=&#34;1156&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34; style=&#34;width: 55%;&#34;&gt;{#fig:xunhuan}&lt;/p&gt;&#xA;&lt;p&gt;既然我们可以用图的形式将以上三种结构画出来，那肯定也可以将整个泡面算法画出来。这个过程并不复杂，就是上面三种结构的混合使用，结果如图{@fig:pm_lc01}。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/002/pic/pm_lc01.drawio_hu_cdf494c83ac6e9c0.webp&#34; alt=&#34;泡方便面流程图&#34; width=&#34;900&#34; height=&#34;1387&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;{#fig:pm_lc01}&lt;/p&gt;&#xA;&lt;p&gt;这就是流程图，它和我们文字版本的泡面算法是等价的。但显然流程图的表现力更强，能够将算法的结构更为清晰地展现出来。&lt;/p&gt;&#xA;&lt;p&gt;刚才我们只介绍了算法和流程图中的三种结构，即顺序结构、选择结构、循环结构，然后就只用这三种结构便画出了我们的泡面算法。可我们的泡面算法毕竟是很简单的，会不会有一些复杂的算法只靠这三种结构是无法实现的？&lt;/p&gt;&#xA;&lt;p&gt;可以确切地告诉你，这三种结构就完全足够了。无论多复杂的程序都可以只用这三种结构组合而成。科学家们早已经证明了这一点&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;&#xA;&lt;p&gt;因此，流程图并不复杂，核心就是上面介绍的三种结构。下表展示了常用的几个符号，我们在前面都已经用过了：&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/002/pic/h11_hu_2f6275e8501c25b8.webp&#34; alt=&#34;流程图常用符号&#34; width=&#34;900&#34; height=&#34;233&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;当我们在设计算法时，可以画出算法的流程图，它真的很有用。有经验的程序员就经常画流程图来帮助自己理清算法思路，或者用来向其他程序员传达自己的算法思路。如果你参与到程序员们的日常讨论中，说不定会遇到他们对着一张流程图激烈地讨论。&lt;/p&gt;&#xA;&lt;p&gt;而只要能画出算法的流程图，就真的离写出电脑运行的程序很近了！&lt;/p&gt;&#xA;&lt;p&gt;事实上，只要将流程图中的内容用程序语法写出来，就得到了程序。&lt;/p&gt;&#xA;&lt;p&gt;可什么是程序的语法呢？&lt;/p&gt;&#xA;&lt;p&gt;我们下节就回答这个问题。&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;1966年，计算机科学家Bohm和Jacopini已经在下面的论文中证明了这一点。Bohm C., Jacopini G. &amp;ldquo;Flow diagrams, Turing machines and languages with only two formation rules.&amp;rdquo; Communications of the Association for Computing Machinery, Vol.9, pp. 366&amp;ndash;371. 1966.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;</description>
			</item>
			<item>
				<title>如何泡一碗方便面</title>
				<link>https://yeecode.top/easyai/001/</link>
				<pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://yeecode.top/easyai/001/</guid>
				<description>&lt;blockquote&gt;&#xA;    &lt;p&gt;本节我们将从熟悉的泡面开始，了解算法的概念。&lt;/p&gt;&#xA;&#xA;  &lt;/blockquote&gt;&lt;p&gt;说起“程序”，我们对其并不陌生，因为它融入了我们生活的方方面面：手机的时钟程序在早上将我们叫醒，空调中的温控程序负责将家中调到合适的温度，汽车的导航程序指引我们如何到达目的地，红绿灯的运行程序有节奏地控制着车流……&lt;/p&gt;&#xA;&lt;p&gt;程序确实是十分有趣的，不过它似乎有些神秘，好像是只有程序员或者黑客才能掌握的内容。&lt;/p&gt;&#xA;&lt;p&gt;不过你现在没时间顾得上这些，因为眼前有一件更为急迫和重要的事情，直接关系到你朋友接下来会不会饿肚子。&lt;/p&gt;&#xA;&lt;p&gt;一位平时并不怎么做家务的朋友刚才突然给你发消息：“江湖救急！现在就我一个人在家，我想泡一碗方便面吃，可我不会，快教我一下吧！”&lt;/p&gt;&#xA;&lt;p&gt;于是，你赶紧给他写了一个详细的操作步骤：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;第①步：将方便面从袋子中取出，放到干净的碗中。&lt;/li&gt;&#xA;&lt;li&gt;第②步：将所有的调料包都取出，并依次拆开，倒入碗中。&lt;/li&gt;&#xA;&lt;li&gt;第③步：向碗中注入适量开水。&lt;/li&gt;&#xA;&lt;li&gt;第④步：用碟子盖住碗。根据喜欢吃的面的软硬程度，等待3到5分钟。&lt;/li&gt;&#xA;&lt;li&gt;第⑤步：打开盖住碗的碟子，就可以吃面了。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;以上步骤，或许泡出的方便面不是最美味的，例如没有讲怎么才能在里面顺便卧一个荷包蛋。但是，肯定是够用的，你知道按照这个步骤，你朋友一定能吃到一碗图{@fig:paomian}一样的热腾腾的泡面。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/001/pic/paomian_hu_caf4d56bd90d4973.webp&#34; alt=&#34;泡面图&#34; width=&#34;900&#34; height=&#34;675&#34; loading=&#34;eager&#34; decoding=&#34;async&#34;&gt;{#fig:paomian}&lt;/p&gt;&#xA;&lt;p&gt;于是，你赶紧将上述操作步骤发给了朋友。&lt;/p&gt;&#xA;&lt;p&gt;但是你忘了，他可是一个很较真的人。很快，他给你回了信息：“我再问一下，你说的适量开水，可到底多少是适量啊？能说的再准确一点么？”，就像图{@fig:paomianchat}展示的一样。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://yeecode.top/easyai/001/pic/paomianchat_hu_fd28522427067d8a.webp&#34; alt=&#34;泡面步骤&#34; width=&#34;900&#34; height=&#34;600&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;{#fig:paomianchat}&lt;/p&gt;&#xA;&lt;p&gt;他的较真你是知道的，他问出这样的问题也不足为怪。毕竟，你刚才的表述中，确实存在一些歧义。&lt;/p&gt;&#xA;&lt;p&gt;考虑到回答完他这个问题之后，他可能还会再问出“我再问下，我喜欢吃硬一点的面，到底是等待3分钟还是5分钟啊？”之类的问题，你于是决定直接再发一版给他。这一次，你十分仔细，力求消除任何歧义。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;第①步：将方便面从袋子中取出，放到干净的600ml容量的空碗中。&lt;/li&gt;&#xA;&lt;li&gt;第②步：将所有的调料包都取出，并依次拆开，倒入上述碗中。&lt;/li&gt;&#xA;&lt;li&gt;第③步：向碗中注入500ml温度为100℃的水，并立刻用直径大于碗的碟子盖住碗。&lt;/li&gt;&#xA;&lt;li&gt;第④步：如果喜欢硬一点的面，则等3分钟；如果喜欢软硬适中的面，则等4分钟；如果喜欢软一点的面，则等5分钟。&lt;/li&gt;&#xA;&lt;li&gt;第⑤步：时间一到就打开盖住碗的碟子，就可以吃面了。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;写完之后，你有读了几遍，还是发现了一些小的歧义点。以你对朋友的了解，他说不定还会问出“所有的调料包我是全取出来后都拆开然后依次倒入碗中，还是一包包依次取出来拆开倒入碗中呢？”&lt;/p&gt;&#xA;&lt;p&gt;于是你继续斟酌，又写了一版：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;第①步：将方便面从袋子中取出，放到干净的600ml容量的空碗中。&lt;/li&gt;&#xA;&lt;li&gt;第②步：取出调料包，拆开，将调料倒入上述碗中。&lt;/li&gt;&#xA;&lt;li&gt;第③步：检查是否还有调料包。如果有，重复第②步；如果没有，进入下一步。&lt;/li&gt;&#xA;&lt;li&gt;第④步：向碗中注入500ml温度为100℃的水，并立刻用直径大于碗的碟子盖住碗。&lt;/li&gt;&#xA;&lt;li&gt;第⑤步：如果喜欢硬一点的面，则等3分钟；如果喜欢软硬适中的面，则等4分钟；如果喜欢软一点的面，则等5分钟。&lt;/li&gt;&#xA;&lt;li&gt;第⑥步：时间一到就打开盖住碗的碟子，就可以吃面了。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这样认真地修改是十分有必要的，毕竟你面对的是一位较真的好朋友，而这又是关系到他能否吃上饭的头等大事。&lt;/p&gt;&#xA;&lt;p&gt;再三校验后，你觉着应该没有什么歧义了，于是将新的泡面步骤发给了他。&lt;/p&gt;&#xA;&lt;p&gt;几分钟后，他回复：“收到！我这就去照做！”&lt;/p&gt;&#xA;&lt;p&gt;这时你长舒一口气，不禁感叹道：原来我们平时讲话中，存在这么多歧义啊！只不过大家都忽略了罢了。要不是因为有这位较真的朋友，还真不容易发现这点。&lt;/p&gt;&#xA;&lt;p&gt;现在，恭喜你的朋友，他在你的帮助下终于可以吃上热腾腾的泡面了。&lt;/p&gt;&#xA;&lt;p&gt;也更要恭喜你，你在帮助朋友的过程中，梳理出了一个完全没有歧义的泡方便面的步骤。这可并不是一件容易的事情，因为我们平时的对话中，很多地方都有歧义，将它们一一找出来并改掉，并不简单。&lt;/p&gt;&#xA;&lt;p&gt;事实上，你发给朋友的泡面步骤可以称之为“泡面算法”。或许“算法”这一词对你而言有些陌生，但它并不复杂。&lt;/p&gt;&#xA;&lt;center&gt; &#xA;&lt;p&gt;算法就是解决特定问题的一系列明确的步骤或规则。&lt;/p&gt;&#xA;&lt;/center&gt;&#xA;&lt;p&gt;就在刚才，为了解决“如何泡一碗方便面”这一特定问题，你已经梳理出了泡面所需要的明确的操作步骤，以及对碗的容量、水的温度等的明确规则。所以，发给朋友的这份泡面步骤完全符合算法的定义，绝对可以称之为“泡面算法”。&lt;/p&gt;&#xA;&lt;p&gt;既然聊到了算法，并且我们还自己写出了“泡面算法”，那有必要继续展开一下，了解下算法的主要特点，就是下面五个：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;有穷性：算法必须在有限的步骤内结束，也就是说必须存在一个明确的终点，不能无限循环下去。我们的泡面算法中，在第③步拆调料包的过程中存在循环，但因为任何方便面的调料包都是有限的，总会被拆完，进而顺利进入第④步，不会在这里一直循环。最终整个泡面的步骤只要执行完第⑥步就结束了，所以整个泡面步骤满足有穷性。&lt;/li&gt;&#xA;&lt;li&gt;可行性：算法中的每一步都必须是可行的。显然，我们泡面算法中的每一步都可以做到。&lt;/li&gt;&#xA;&lt;li&gt;输入：算法可以有零个、一个或者多个输入。输入就是要提供给算法处理的东西。在泡面算法中，需要的输入有：一袋方便面、一个600ml容量的空碗、500ml温度为100℃的水、一个直径大于碗的碟子。虽然我们没有提前明确地向朋友说明他要准备好这些东西，但相信他只要读一遍步骤就能知道。&lt;/li&gt;&#xA;&lt;li&gt;输出：算法可以有一个或者多个输出。输出就是算法执行完后，给出的东西。显然，泡面算法的输出就是一碗泡好的方便面。&lt;/li&gt;&#xA;&lt;li&gt;确定性：算法的每一步操作必须有明确的定义，没有歧义，在相同输入的情况下，总会得到相同输出。这也是我们不断改写泡面步骤的原因，只有这样，才能确保不同时间、不同的人看到后都有相同的理解，总会做出相同的操作，进而保证只要输入一样，一定会得到相同的输出。我们的泡面算法经过不断改进后，最终满足了这一点。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote class=&#34;alert alert-question alert-question&#34;&gt;&#xA;    &lt;p class=&#34;alert-title&#34;&gt;想一想&lt;/p&gt;&#xA;    &lt;p&gt;你或许已经发现，算法可以有零个、一个或者多个输入，可以有一个或者多个输出。仔细对比我们会发现，算法可以有零个输入，但是不能有零个输出，这是为什么呢？&lt;/p&gt;&#xA;&lt;p&gt;有些算法确实不需要输入，例如一个算法的功能可以是给出一个随机数，那它就不需要输入。每次执行这个算法时，算法通过内部的机制给出一个随机数即可。&lt;/p&gt;&#xA;&lt;p&gt;算法在执行过程中，可以给出一个内容、让电脑等待一些时间、在屏幕上显示一个字符等等，这些都算它的输出。而如果一个算法没有任何输出，那就没有存在的意义，当我们使用这个算法时，也没法感知这个算法是不是正常工作。所以算法通常是有输出的。&lt;/p&gt;&#xA;  &lt;/blockquote&gt;&lt;p&gt;算法实际上是给出了解决问题的步骤，如果我们将每一步都按照编程语法写出来，就得到了程序。我们可以把算法比作是解答一到数学题的解题思路，而程序就是按照数学符号写出来的解题步骤。可见，算法就是程序的灵魂。&lt;/p&gt;&#xA;&lt;p&gt;现在我们已经写出了泡面算法，这意味着，将来我们可以写出泡面程序。说到这里，你或许会疑惑：我们的泡面算法中的每一步都是给人看的，计算机难以实现取方便面、倒热水等操作，似乎很难转化为计算机程序。&lt;/p&gt;&#xA;&lt;p&gt;不，可别丧气。后面我们这真的会将这一切都转化为计算机程序，让计算机帮我们泡面。&lt;/p&gt;&#xA;&lt;p&gt;不过，这是后面几章的事情。在此之前，我们还有不少的知识要学。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
