目录
🍊🍊一、什么是算法?
🍊🍊二、简单的算法举例
🍊🍊三、算法的特性
🍊🍊四、怎样表示一个算法
一个程序主要包括以下两方面的信息:
(1)对数据的描述。在程序中要指定用到哪些数据,以及这些数据的类型和数据的组织形式。这就是数据结构(data structure)。
(2)对操作的描述。要求计算机进行操作的步骤,也就是算法(algorithm)。
著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式:
算法+数据结构=程序
一、什么是算法?
计算机算法可分为两大类别:数值运算算法和非数值运算算法。数值运算的目的是求数值解,例如求方程的根、求一个函数的定积分等,都属于数值运算范围。非数值运算涉及的面十分广泛,最常见的是用于事务管理领域,例如对一批职工按姓名排序、图书检索、人事管理和行车调度管理等。目前,计算机在非数值运算方面的应用远远超过了在数值运算方面的应用。
由于数值运算往往有现成的模型,可以运用数值分析方法,因此对数值运算的算法的研究比较深入,算法比较成熟。对各种数值运算都有比较成熟的算法可供选用。人们常常把这些算法汇编成册(写成程序形式),供用户调用。
非数值运算的种类繁多,要求各异,难以做到全部都有现成的答案,因此只有一些典型的非数值运算算法(例如排序算法、查找搜索算法等)有现成的、成熟的算法可供使用。许多问题往往需要使用者参考已有的类似算法的思路,重新设计解决特定问题的专门算法。
二、简单的算法举例
【例1】求1×2×3×4×5。
可以用最原始的方法进行:
步骤 1:先求1乘以 2,得到结果 2。
步骤2:将步骤1得到的乘积2再乘以 3,得到结果6。
步骤3:将6再乘以4,得24。
步骤4:将 24 再乘以 5,得120。这就是最后的结果。
这样的算法虽然是正确的,但太烦琐。如果要求1×2×…×1000,则要写999个步骤。显然是不可取的。而且每次都要直接使用上一步骤的具体运算结果(如2,6,24等),也不方便,应当能找到一种通用的表示方法。
不妨这样考虑:设置两个变量、一个变量代表被乘数,一个变量代表乘数。不另设变量存放乘积结果,而是直接将每一步骤的乘积放在被乘数变量中。今设变量t为被乘数,变量 i为乘数。用循环算法来求结果。可以将算法改写如下:
S1:令t=1,或写成1→t(表示将1存放在变量t中)
S2:令i=2,或写成2→i(表示将2存放在变量i中)
S3:使t与i相乘,乘积仍放在变量t中,可表示为:*i→t
S4:使i的值加1,即i+1→i
S5:如果i不大于5.返回重新执行S3及其后的步骤S4和S5;否则,算法结束。最后得到t的值就是5!的值。
上面的S1,S2...代表步骤1、步骤2……S是Step(步)的缩写。这是写算法的习惯用法。
由于计算机是高速运算的自动机器,实现循环是轻而易举的,所有计算机高级语言中都有实现循环的语句。因此,上述算法不仅是正确的,而且是计算机能方便实现的较好的算法。
【例2】判定2000——2500年中的每一年是否为闰年,并将结果输出。
先分析闰年的条件:
(1)能被4整除,但不能被100整除的年份都是闰年,如2008年、2012年、2048年都是闰年;
(2)能被400整除的年份是闰年,如1600年、2000年是闰年。
不符合这两个条件的年份是闰年,如2009年、2100年不是闰年。
设 year 为被检测的年份。算法可表示如下:
S1:2000→year
S2:若year不能被4整除,则输出year的值和“不是闰年”。然后转到S6,检查下一个年份
S3:若year能被4整除,不能被100整除,则输出year的值和“是闰年”。然后转到S6
S4:若year能被400整除,输出year的值和“是闰年”,然后转到S6
S5:输出year的值和“不是闰年”
S6:year+1→year
S7:当year≤2500时,转到S2继续执行,否则算法停止。
从图中可以看出:“其他”这一部分,包括不能被4整除的年份,以及能被4整除,又能被100整除,但不能被400整除的那些年份(如1900年),它们都是非闰年。
三、算法的特性
(1)有穷性
(2)确定性
(3)有零个或多个输入
(4)有一个或多个输出
(5)有效性
四、怎样表示一个算法
常用的表示方法并且通俗易懂的方法:
流程图
流程图是用一些图框来表示各种操作。用图形表示算法,直观形象,易于理解。
连接点(小圆圈)是用于将画在不同地方的流程连接起来。
【例2】中的算法,我们可以用下图来表示: