自顶向下,逐步求精
2017-12-01 11:10
323 查看
大事化小,小事化了
[align=right](大误)[/align]
在思想上它们也有区别:自下而上的编程是先详细制造好小模块,最后将小模块连接起来形成大系统;而自上而下确是为了解决大系统问题,将大的系统分割成小块。
第二部分的阐释足够明确,可以很轻易解决;现在解决第一部分。
根据辗转相减法,当x大于y时,gcd(x, y) = gcd(x, x - y)。因此可以递归解决问题:
判断x是否等于y,如果是则结果是x(或者y);
如果不是,则用二者之中较大者减去较小者,得到的差与二者较小者继续求gcd。
这样,问题就解决了。
[align=right]话说回来,goto语句有什么不好了……关键时刻还是很靠谱的呀……[/align]
[align=right](大误)[/align]
概览
说白了,这个思想就有点像Top-down:将一个大问题分割为若干个小块,然后将小块再分割为更小的小块。力求每个小块都完美地解决。当所有的小块都精致地解决了之后,大问题也随之解决。起源
该编程思想与模块化设计与结构化设计有着密切关系。大问题分解出的小问题可以被看作是一个个的模块;而“自顶向下,逐步求精”的思想是结构化设计的一个重要原则。goto语句
结构化设计的起源是对goto语句的争论。20世纪60年代,结构化编程起步,期间Dijkstra(对,就是那个Dijkstra)发表了经典论文《goto语句有害论》。随后结构化设计逐渐变得流行,也就出现了“自顶向下,逐步求精”的思想。自顶而下与自下而上的区别
听到名字就可以知道它们的最大的区别:一个是自下而上,另一个反之。在思想上它们也有区别:自下而上的编程是先详细制造好小模块,最后将小模块连接起来形成大系统;而自上而下确是为了解决大系统问题,将大的系统分割成小块。
示例:求多个数的最大公约数
首先将问题分解成两个步骤:求两个数的最大公约数;从头两个数开始求最大公约数,然后将求得的最大公约数与后面的数一起求最大公约数,直到结束。第二部分的阐释足够明确,可以很轻易解决;现在解决第一部分。
根据辗转相减法,当x大于y时,gcd(x, y) = gcd(x, x - y)。因此可以递归解决问题:
判断x是否等于y,如果是则结果是x(或者y);
如果不是,则用二者之中较大者减去较小者,得到的差与二者较小者继续求gcd。
这样,问题就解决了。
[align=right]话说回来,goto语句有什么不好了……关键时刻还是很靠谱的呀……[/align]