用日常语言描述算法:就像讲故事一样
中等12把算法“讲”出来:用日常语言描述步骤
你有没有给别人指过路?比如朋友问:“你家怎么走?”你可能会说:“出小区大门左转,走到第一个红绿灯再左转,一直走到蓝色房子那栋。”你刚才就在用自然语言描述一个“路线算法”。自然语言描述算法,就是用我们平时说话、写文章的语言(比如中文),把解决一个问题的步骤按照先后顺序写出来。它不需要懂编程,任何人都能看懂。
但是,自然语言有个小毛病——可能不精确。比如你说“放一点盐”,到底是多少?计算机可不会猜。所以用自然语言描述算法时,我们要尽量把每一条步骤说清楚,每个动作都要明确,不能有歧义。
下面我们就来详细看看,怎样像讲故事一样把算法说清楚。
1. 什么是自然语言描述?举个身边的例子
想象你要计算今天一共花了多少零花钱。你买了文具花了8元,零食花了5元,还剩下20元。你想把消费过程描述给同桌听,可以这样说:
- 今天我带了30元零花钱。
- 买文具花掉8元,剩余22元。
- 买零食花掉5元,剩余17元。
- 告诉我还剩多少钱。
这段描述里,每一步都按顺序来,没有跳步,也没有模棱两可的话。这就叫做用自然语言描述了一个“计算剩余零花钱”的算法。
另外,你肯定玩过“猜数字”游戏:一个人心里想一个1~100之间的数,另一个人猜,猜的人每次说“大了”或“小了”。其实这就是一个算法的自然语言描述——每次猜中间的数,然后根据提示缩小范围。不信你试试:“我想的数字是50,大了,那就猜25,小了,那就猜37……”这个逻辑就是二分查找算法。
2. 为什么要用自然语言描述算法?
好处多多:
- 容易理解:任何同学(哪怕没学过编程)都能看懂,还能按步骤做。
- 理清思路:先想好“做什么”,再想“怎么写代码”,不容易漏掉步骤。
- 团队沟通:写代码前,和同学、老师讨论时,用自然语言讲一遍,大家都能提出建议。
但也要注意缺点:
- 可能有歧义:比如“拿一本书”没有说是哪一本,“走几步”没有说走多少步。
- 不够精确:计算机需要非常明确的指令,比如“如果分数大于等于90,输出‘优秀’”,而不是“成绩好就优秀”。
所以,写自然语言描述时,我们要像写菜谱一样,每一条都具体、清楚。
3. 怎样写好自然语言描述?三个要点+例子
要点一:步骤要按顺序,不能颠倒
比如给冰箱贴纸条:“先打开冰箱门,再放入饮料,最后关好门。”如果顺序写反了,“先放入饮料,再打开冰箱门”就成了笑话。
例子:用自然语言描述“判断考试成绩等级”
- 输入一个分数 score。
- 如果 score >= 90,输出“优秀”。
- 如果 score >= 80 且 < 90,输出“良好”。
- 如果 score >= 60 且 < 80,输出“及格”。
- 如果 score < 60,输出“不及格”。
- 结束。
注意这里写的是“如果……如果……”,顺序很重要,不能先写“不及格”再写“优秀”,否则会出错。
要点二:每个动作要明确,不能有歧义
不要说“放一点点盐”,要说“放一勺盐”。不要说“走一会儿”,要说“走200米”或“走到第二个路口右转”。
例子:用自然语言描述“排队取餐”
- 排到窗口前,拿出饭卡。
- 把饭卡放在读卡器上。
- 听完“滴”一声后拿走饭卡。
- 对阿姨说“我要一份鸡腿饭”。
- 接过餐盘,说“谢谢”。
- 离开窗口。
每一步都很具体,不会让人不知道下一步该干嘛。
要点三:遇到判断和重复要写清楚
自然语言里常用“如果……就……否则……”来表示判断,用“重复做……直到……”来表示循环。
例子:用自然语言描述“从1加到100”(计算总和)
- 设置一个变量 total = 0(用来存放总和)。
- 设置一个变量 i = 1(从1开始)。
- 重复下面步骤,直到 i > 100:
- 把 total 加上 i,结果存回 total。
- 把 i 加 1。
- 输出 total。
- 结束。
这里用了“重复……直到……”,就像体育老师喊“大家跑圈,直到铃响”。
4. 从自然语言到C++代码:两段完整过渡
例1:判断奇偶数(保留原有内容)
自然语言描述:
- 输入一个整数 n。
- 检查 n 除以 2 的余数(用数学运算“n % 2”表示取余数)。
- 如果余数等于 0,那么输出“偶数”;否则输出“奇数”。
- 结束。
对应的C++代码:
#include <iostream>
using namespace std;
int main() {
int n; // 定义一个整数 n 存放输入
cin >> n; // 步骤1:输入一个整数
if (n % 2 == 0) { // 步骤2:检查余数是否等于0
cout << "偶数" << endl; // 步骤3:是偶数
} else {
cout << "奇数" << endl; // 步骤3:否则是奇数
}
return 0; // 步骤4:程序结束
}
你看,自然语言里的每一句话,几乎都能直接翻译成代码中的一行或几行。
例2:判断考试成绩等级(新补充)
自然语言描述(上面已经写好了):
- 输入分数 score。
- 如果 score >= 90,输出“优秀”。
- 否则如果 score >= 80,输出“良好”。
- 否则如果 score >= 60,输出“及格”。
- 否则输出“不及格”。
- 结束。
对应C++代码:
#include <iostream>
using namespace std;
int main() {
int score; // 定义整数变量 score 存放考试分数
cin >> score; // 输入分数
if (score >= 90) { // 优秀
cout << "优秀" << endl;
} else if (score >= 80) { // 良好
cout << "良好" << endl;
} else if (score >= 60) { // 及格
cout << "及格" << endl;
} else { // 不及格
cout << "不及格" << endl;
}
return 0;
}
是不是很简单?先用自然语言把“如果……否则如果……”理清楚,再写代码就顺畅多了。
5. 新手最容易犯的几种错误
-
步骤顺序写反了
比如描述“洗衣服”:先放衣服,再加水,最后放洗衣液,还是先放洗衣液再放衣服?如果描述不对,实际做起来就会搞错。 -
缺少明确的停止条件
比如“一直往前走”——走到什么时候?走几步?还是走到路口?应该写“走到第一个十字路口停下”。 -
用口语里模糊的词语
比如“比较大的数”、“有点多”——计算机听不懂。要改成“大于100”、“等于5个”。 -
跳步或漏步
比如描述“从冰箱拿水果”:只写“打开冰箱,拿出一个苹果”,忘了写关门。应该加上“关上冰箱门”。
例子:一个错误的自然语言描述
- 输入一个数字。
- 如果这个数字大于0,输出“正数”。
- 否则输出“负数”。
- 结束。
错在哪儿?如果数字等于0,它既不是正数也不是负数,但我们的描述里没有考虑等于0的情况。正确做法:增加“否则如果等于0,输出‘零’”。这就是遗漏情况的错误。
6. 完整可运行示例:简单加法计算器
我们用自然语言描述“两个数相加并输出结果”:
自然语言描述:
- 输入两个整数 a 和 b。
- 计算 a + b 的值,存到变量 sum 中。
- 输出 sum。
- 结束。
C++代码:
#include <iostream>
using namespace std;
int main() {
int a, b; // 定义两个整数变量 a 和 b
cin >> a >> b; // 输入两个整数
int sum = a + b; // 计算 a + b 并存入 sum
cout << sum << endl; // 输出结果
return 0; // 结束
}
复制到编译器里,输入 3 5,就能看到输出 8。是不是很像你看完菜谱、再做菜一样?
7. 接下来你可以学什么?
- 流程图:用图形把算法画出来,比文字更直观。
- 伪代码:介于自然语言和编程语言之间,更像“半中文半程序”的描述。
- 编程基础知识:学完自然语言描述,就去学 C++ 的变量、输入输出、判断和循环,你会发现写代码就像翻译自然语言一样简单。
记住:先学会“讲故事”(自然语言描述),再学会“演戏”(写代码)。你讲得清楚,代码就会写得正确。试试把今天老师讲的数学题步骤用自然语言写下来,再转成代码,你一定会越来越厉害!
例题精讲
关于用自然语言描述算法,下列说法正确的是?
以下哪个是自然语言描述算法时应该避免的做法?
自然语言描述算法时,使用“重复执行几次”这样的表述,必须明确重复的具体次数,否则会产生歧义。
自然语言描述算法时,描述“如果x大于0,则输出x,否则输出-x”存在歧义,因为“否则”可能既指代x小于0的情况,又指代x等于0的情况。
下面是一个用自然语言描述的“计算两个数的最大值”算法的步骤,请在横线处填上合适的词语使描述完整。
步骤1:输入两个数a和b。
步骤2:___,那么最大值是a;否则,最大值是b。
步骤3:输出最大值。