一、算法
算法是解决问题方法的精确描述,但是并不是所有问题都有算法,有些问题经研究可行,则相应有算法,但这并不是说问题就有结果。上述的“可行”,是指对算法的研究。
1.待解问题的描述
待解问题表述应精确、简练、清楚,使用形式化模型刻划问题是最恰当的。例如,使用数学模型刻划问题是最简明、严格的,一旦问题形式化了,就可依据相应严格的模型对问题求解。
2.算法设计
算法设计的任务是对各类具体问题设计良好的算法及研究设计算法的规律和方法。常用的算法有:穷举搜索法、递归法、回溯法、贪心法、分治法等。
3.算法分析
算法分析的任务是对设计出的每一个具体的算法,利用数学工具,讨论各种复杂度,以探讨某种具体算法适用于哪类问题,或某类问题宜采用哪种算法。
算法的复杂度分时间复杂度和空间复杂度。
.时间复杂度:在运行算法时所耗费的时间为f(n)(即 n的函数)。
.空间复杂度:实现算法所占用的空间为g(n)(也为n的函数)。
称O(f(n))和O(g(n))为该算法的复杂度。
二、程序设计
1.程序
程序是对所要解决的问题的各个对象和处理规则的描述,或者说是数据结构和算法的描述,因此有人说,数据结构+算法=程序。
2.程序设计
程序设计就是设计、编制和调试程序的过程。
3.结构化程序设计
结构化程序设计是利用逐步求精的方法,按一套程式化的设计准则进行程序的设计。由这种方法产生的程序是结构良好的。所谓“结构良好”是指:
(1)易于保证和验证其正确性;
(2)易于阅读、易于理解和易于维护。
按照这种方法或准则设计出来的程序称为结构化的程序。
“逐步求精”是对一个复杂问题,不是一步就编成一个可执行的程序,而是分步进行。
.第一步编出的程序最为抽象;
.第二步编出的程序是把第一步所编的程序(如过程、函数等)细化,较为抽象;
.……
.第i步编出的程序比第i-1步抽象级要低;
.……
.直到最后,第n步编出的程序即为可执行的程序。
所谓“抽象程序”是指程序所描述的解决问题的处理规则,是由那些“做什么”操作组成,而不涉及这些操作“怎样做”以及解决问题的对象具有什么结构,不涉及构造的每个局部细节。
这一方法原理就是:对一个问题(或任务),程序人员应立足于全局,考虑如何解决这一问题的总体关系,而不涉及每局部细节。在确保全局的正确性之后,再分别对每一局部进行考虑,每个局部又将是一个问题或任务,因而这一方法是自顶而下的,同时也是逐步求精的。采用逐步求精的优点是:
(1)便于构造程序。由这种方法产生的程序,其结构清晰、易读、易写、易理解、易调试、易维护;
(2)适用于大任务、多人员设计,也便于软件管理。
逐步求精方法有多种具体做法,例如流程图方法、基于过程或函数的方法。
[例]求两自然数,其和是667,最小公倍数与最大公约数之比是120:1(例如(115,552) 、(232,435))。
[解]两个自然数分别为m和667-m(2≤m≤ 333)。
处理对象:m(自然数)、l(两数的最小公倍数)、g(两数的最大公约数)。
处理步骤:对m从2到333检查l与g的商为120,且余数为0时,打印m与667-m 。
第一层抽象程序:
Program TwoNum;
Var m,l,g:integer;
Begin for m:=2 to 333 do
begin l:=lcm(m,667-m); {求最小公倍数}
g:=gcd(m,667-m); {求最大公约数}
if (l=g*120)and(l mod g=0) then
writeln(m:5,667-m:5);
end;
End.
第二层考虑函数lcm(最小公倍数)、gcd(最大公约数)的细化。
最大公约数问题是对参数a、b,找到一个数i能整除a与b,i就是gcd的函数值。
Function gcd(a,b:integer):integer;
var i:integer;
begin for i:=a downto 1 do
if not((a mod i=0)or(b mod i=0)) then gcd:=i;
end;
而最小公倍数的计算是:若干个b之和,若能被a整除,则该和便是a、b的最小公倍数。
Function lcm(a,b:integer):integer;
var i:integer;
begin i:=b;
while i mod