考纲要求
- 理解算法是解决一类问题的明确步骤序列,具有有穷性、确定性、可行性、零个或多个输入、至少一个输出等特征。
- 能用自然语言按步骤描述算法,做到每一步都无歧义。
- 能把同一算法翻译成流程图或伪代码,并保持步骤一一对应。
- 理解对同一问题可以有不同的算法,需要从正确性、步骤数量和实现难度上比较。
典型题型
- 判断一段步骤描述是否满足算法的特征。
- 把自然语言描述翻译成伪代码。
- 比较两种算法在给定输入下的执行步骤数。
常见错误
- 把算法的有穷性理解成程序必须很快结束。有穷性指步骤数量有限,而不是时间很短。
- 描述中出现「适当处理」这类含糊说法,违反确定性,别人无法照着执行。
- 认为步骤越少算法越好,忽略正确性和可读性。
- 把流程图的具体符号当成算法本身,算法是思路,流程图只是表达方式之一。
深入理解
算法有五个特征,缺一不可
- 有穷性:执行有限步之后必须结束,不能无限循环。
- 确定性:每一步的含义唯一,同样的输入只能得到同样的输出,不能出现「可能这样也可能那样」。
- 可行性:每一步都能用现有操作完成,不能写「求出所有质数」这种没有具体步骤的话。
- 输入:有零个或多个输入。
- 输出:至少有一个输出,没有输出的过程不算算法。
判断题常拿「确定性」和「有穷性」做文章:写「随机取一个数」违反确定性,写「重复直到满足条件」若没给出终止条件则违反有穷性。算法不等于程序——算法是思路,程序是算法的某种语言实现,同一个算法可以写出多个程序。
三种描述方式各有用途
自然语言最容易写也最容易歧义,比如「把最大的数放到第一个位置」就有多种理解。流程图直观,分支和循环一眼可见,但复杂算法画出来会非常拥挤。伪代码介于两者之间,用接近编程语言的结构(if、for、赋值)但不受语法约束,是竞赛和教材里最常用的方式。
写伪代码时保持三条:同一个变量名前后一致、循环要写清初值和终止条件、输出写明确。不需要纠结分号或括号,考官看的是逻辑是否完整。
判断一段描述能不能算算法
给出一段文字让判断「这是不是算法」,按五个特征逐条核对即可。最常见的不合格情形是缺少终止条件,例如「不断读入数字,直到读到负数为止」——如果没说明读完所有数据后的处理,就不完整。另一种是把结果当成条件,例如「当数组已经有序时停止排序」,如果排序过程本身不保证会推进到有序,就可能永远停不下来。
自编例题
用伪代码描述求最大值
输入 n 个整数,输出其中的最大值。请用伪代码写出算法步骤。
读取 n 和第一个数 x,令 best = x
重复 n-1 次:
读取下一个数 x
如果 x > best,则令 best = x
输出 best这个算法先假定第一个数是最大值,然后逐个比较,遇到更大的就更新。整个算法只遍历一次,步骤数量与 n 成正比。写伪代码时不必纠结具体语法,但要保证每一步都明确:读什么、比较什么、什么时候更新、最后输出什么。如果把同一思路画成流程图,重复部分用一个带回边的判断框表示。伪代码和流程图都是算法的表达,考试中按题目要求选择即可。
相关真题
这块内容在整条路线里的位置:GESP C++ 3 级备考路径。
READY TO START
开始练习
先做一套本级别测评,报告会指出哪些知识点需要重点补;再回到本页对照考纲要求逐条核对,把不确定的条目记下来集中练。
常见问题
算法和程序有什么区别?
算法是解决问题的步骤描述,与语言无关;程序是算法用某种编程语言实现后的产物,还要考虑语法和运行环境。
算法必须有输入吗?
不一定。算法可以有零个或多个输入,但至少要有一个输出,否则无法得到结果。
伪代码要写得多详细?
写到每一步都能被别人照着执行即可,不必写具体语法。关键是分支条件、循环边界和更新步骤不能含糊。
