每个问题的解决方案都始于一个计划。这个计划被称为算法。编写算法的方法有很多种。有些是非常非正式的,有些是相当正式的数学性质的,还有些是相当图形化的。将 DVD 播放器连接到电视机的说明就是一种算法。πR2这样的数学公式是算法的一种特例。只要能很好地描述和检查计划的逻辑,形式并不特别重要。
制定算法(计划)是解决问题的关键一步。一旦有了算法,我们就可以用某种编程语言将其转化为计算机程序。我们的算法开发过程包括五个主要步骤。
第 1 步:获取问题描述。
这一步比表面看起来要困难得多。在下面的讨论中,客户指的是希望找到问题解决方案的人,而开发人员指的是找到解决问题方法的人。开发人员必须创建一种能够解决客户问题的算法。
客户负责对问题进行描述,但这往往是整个过程中最薄弱的部分。问题描述通常存在以下一种或多种缺陷:(1) 描述依赖于未说明的假设,(2) 描述模棱两可,(3) 描述不完整,或 (4) 描述存在内部矛盾。这些缺陷很少是由于客户的粗心造成的。相反,它们是由于自然语言(英语、法语、韩语等)相当不精确这一事实造成的。开发人员的部分责任就是发现问题描述中的缺陷,并与客户一起弥补这些缺陷。
第 2 步:分析问题。
这一步的目的是确定解决问题的起点和终点。这一过程类似于数学家确定什么是给定的,什么是必须证明的。良好的问题描述会让这一步更容易完成。
在确定起点时,我们应首先寻求以下问题的答案:
有哪些可用数据?
数据在哪里?
哪些公式与问题有关?
处理数据有哪些规则?
数据值之间存在哪些关系?
在确定终点时,我们需要描述解决方案的特征。换句话说,我们如何知道何时完成?提出以下问题通常有助于确定终点。
我们将获得哪些新事实?
哪些项目会发生变化?
对这些项目做了哪些修改?
哪些东西将不复存在?
第 3 步:制定高级算法。
算法是解决问题的计划,但计划有多个细节层次。通常情况下,最好从包含解决方案主要部分的高级算法开始,而将细节留到以后再处理。我们可以用一个日常的例子来演示高级算法。
问题:我需要给我弟弟马克寄一张生日贺卡。
分析:我没有贺卡:我没有贺卡。我宁愿买一张贺卡,也不愿自己做一张。
高级算法:
去卖贺卡的商店
选择贺卡
购买贺卡
邮寄贺卡
这种算法在日常使用中是令人满意的,但它缺少一些细节,而这些细节必须由计算机来执行。这些细节包括以下问题的答案。
"我要去哪家商店?
"我将如何到达那里:步行、开车、骑自行车、乘公共汽车?
"马克喜欢什么样的卡片:幽默的、感伤的、俏皮的?"
我们在下一步流程中会考虑到这些细节。
第 4 步:通过添加更多细节来完善算法。
高级算法显示了解决问题需要遵循的主要步骤。现在,我们需要为这些步骤添加细节,但我们应该添加多少细节呢?不幸的是,这个问题的答案取决于具体情况。我们必须考虑由谁(或由什么)来执行算法,以及这个人(或事)已经知道了多少该怎么做。如果有人要替我购买马克的生日贺卡,我的指令就必须根据这个人是否熟悉社区里的商店以及购买者对我弟弟贺卡品味的了解程度来调整。
当我们的目标是开发能够产生计算机程序的算法时,我们需要考虑计算机的能力,并提供足够的细节,以便其他人能够使用我们的算法,按照我们算法中的步骤编写计算机程序。就像生日卡问题一样,我们需要根据程序员的能力来调整详细程度。当有疑问时,或者当你正在学习时,细节过多总比细节过少要好。
我们的大多数示例都会在一个步骤中从高级算法过渡到详细算法,但这并不总是合理的。对于更大、更复杂的问题,我们通常会多次经历这一过程,并在此过程中开发出中级算法。每一次,我们都会在前一个算法的基础上增加更多细节,当我们发现进一步完善没有好处时,就会停止。这种从高级算法逐步过渡到详细算法的技术通常被称为逐步细化算法。
第 5 步:审查算法。
最后一步是审查算法。我们在寻找什么?首先,我们需要逐步查看算法,以确定它是否解决了原始问题。一旦我们确信算法确实提供了解决方案,我们就开始寻找其他方面。以下问题是在审查算法时应该提出的典型问题。提出这些问题并寻找它们的答案是培养可应用于下一个问题的技能的好方法。
这个算法是否解决了一个非常具体的问题,还是解决了一个更一般的问题?如果它解决了一个非常具体的问题,是否应该泛化?
例如,一个计算半径为5.2米的圆的面积的算法(公式π*5.22)解决了一个非常具体的问题,但计算任何圆的面积的算法(公式π*R2)解决了一个更一般的问题。
这个算法是否可以简化?
计算矩形周长的一个公式是:
长度 + 宽度 + 长度 + 宽度
一个更简单的公式可以是:
2.0 * (长度 + 宽度)
这个解决方案是否类似于另一个问题的解决方案?它们有什么相似之处?它们有什么不同之处?
例如,考虑以下两个公式:
矩形面积 = 长 * 宽
三角形面积 = 0.5 * 底边 * 高度
相似之处:它们都计算面积。它们都将两个测量值相乘。
不同之处:使用了不同的测量值。三角形公式包含了0.5。
假设:也许每个面积公式都涉及将两个测量值相乘。
如果你对此还有疑问,或者有更多关于学业辅导方面需求的话,可以添加微信号:hmkt131联系海马课堂的Joye老师哦。