您的位置:首页 > 其它

自顶向下,逐步求精——算法设计简介

2017-11-24 22:06 211 查看
自顶向下设计最初把问题分解成一套子问题,然后再把子问题分解成子问题。这一过程将一直持续到每个子问题足够基础,不再需要进一步分解为止。我们创造了一种分层结构来表示问题和子问题(称为模块)之间的关系,这种结构也称为树形结构。在树形结构中,每一层中的模块都可以调用下层模块的服务。这些模块是算法的基本构件,也正是上一节中所做的。

把问题分解成子问题,模块或者片段的目的,是要独立地解决每个模块。在计算领域中,一个模块可能用于读取数据,一个模块可能用于对数据求和,一个模块用于输出所求的和,而另一个模块则用于比较上一周得到的总值和当前所求的和。



一般,我们会花时间从全局考虑一下问题,然后简单记下主要步骤,再分析每个步骤填充细节。如果我们不知道如何完成某个任务,就先执行下一个任务,当得到更多信息后,再返回执行这个跳过的任务。我们所做的是什么呢?就是分治策略,把问题分解成子问题。

把每个任务扩展成最小的细节,需要扩展的步骤是抽象步骤,不需要扩展的步骤是具体步骤。如果一个任务困难重重,可以把它的细节推到较低的层次当中。这一过程也可以用到棘手的子任务上。整个问题最终被分解成能够解决的单元。

总的来说,自顶向下的方法可以分成四个主要步骤:

1.分析问题

2.编写主要模块

3.编写其余模块

4.根据需要进行重组和改写

可以通过一些实例来练习和体会这种逐步求精的思想。

以洗衣机的运作过程为例:

0)选择洗衣模式:对应水位,注水时间

1)注水, 水位计计水位

2)浸泡, 计时器计时

3)电机转动, 左3次,右3次

4)排水, 水位计计水位

5)电机转动(脱水)

6)结束

伪代码如下:

READ 用户选择模式

REPEAT

注水

UNTILL 水位=注水要求

REPEAT

浸泡

UNTILL 时间 = 时间要求

WHILE(电机启动时间>0)

REPEAT

电机左转3次

电机右转3次

时间-1单位

ENDWHILE

WHILE(水位!=0)

排水

ENDWHILE

FOR(脱水时间>0)

电机转动

ENDFOR

关闭电源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: