开始《Python入门经典以解决计算问题为导向的Python编程实践》第三章算法和程序开发的内容了。
算法和程序
算法
算法:计算或其他解决问题的操作需要遵循的一个过程或者一套规则。
算法有时被非正式地描述为:解决问题的诀窍。
算法示例
例子1
从头开始来做1个巧克力蛋糕。准备食物的算法一般称为食谱,食谱有两个组成部分,对象(成分)和对这些对象的操作。如果原料是新鲜的,只要按照正确地步骤操作,就会有蛋糕吃。下面是食谱。
巧克力蛋糕食谱:
面粉1.5杯、糖1杯、盐1/2茶匙、小苏打1茶匙、可可2茶匙、醋1茶匙、油6茶匙、香草粉1茶匙、水1杯。
操作步骤:
1)将前5种成分筛在一起
2)加入其余的原料然后混合。
3)将它们倒人抹了油和面粉的9平方英寸模子。
4)用350度烤30分钟。
5)放凉,撒上您最喜爱的糖霜:
6)开始享用吧!
食谱里不只有食品,还包括数量的计算。
例子2:
用数学算法来计算一个数的平方根,即巴比伦平方根算法。这个古老的算法是由巴比伦人发明的,在公元1世纪时,由居住在亚历山大的希腊数学家海伦进行了描述。这种算法能以惊人的快速计算,准确地找到平方根。可以使用铅笔和纸张来手工计算,也可以在计算机上应用。该算法有时也称为牛顿算法,因为牛顿对此算法进行了概括。算法如下:
巴比伦平方根算法:
1)猜测数字的平方根。
2)用猜测的数字除原数。
3)计算步骤2)的商与猜测数的平均值。
4)对第3)步的平均值再作猜测。
5)如果新的猜测值与旧的猜测值不同,则回到第2)步,否则,停止。
巴比伦平方根算法和许多算法一样有个1个共同特点:细节是鬼(很难把握)。例如,在第5)步中的“不同”是什么意思?也许猜测的值差异在千分之几,我们已经感到满意了(如果用铅笔和纸张计算那已经快累死了)、那算不算“不同”呢?
算法和程序
算法是对如何解决问题的描述。
程序是在特定类型的计算机上,用特定语言对算法的实现。
算法和程序要区分开来,一般来说,一个算法可以有多种实现方式。
算法需要有足够的细节,以便能按照它实现全部预期的结果。
如例子1中“混合这些原料并进行烹饪”不够详细,如何使用勺子进行搅拌,对于缺乏经验的人来说需要更多的细节提示。
计算机算法也是如此,对于不同的人,对算法的详细程度也有不同的要求。
算法特征
- 有限性(Finiteness):一个算法必须保证执行有限步之后结束。
- 确切性(Definiteness): 一个算法的每一步骤必须有确切的定义。
- 输入(Input):一个算法有零个或多个输入,以刻画运算对象的初始情况,所谓零个输入是指算法本身给定了初始条件。
- 输出(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。
- 可行性(Effectiveness):一个算法是能行的,即它描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
算法的描述
算法在描述时必须指定其行为,是否需要用户输入什么样的数据,这些数据会做什么计算,最后会输出怎样的结果。
描述算法一般来说有几种方式:
- 自然语言描述。自然语言就是用我们平时通俗的语言描述出来,在例1和例2中用文字描述的算法就是自然语言描述。(这种方法,要是遇到复杂的算法,就会变得很冗长)
- 流程图描述。可以很好的表现出秩序执行过程中的三种基本结构组成—顺序结构、选择结构、循环结构等。需要注意的是,在使用流程图时,规定需要使用一些基本图形。(下图是一个案例,可以发现流程图能够将算法的思路一目了然地展示出来)
- 伪代码 :伪代码是一种介于自然语言与编程语言之间的算法描述语言,便于理解,并不依赖于语言,它用来表示程序执行过程,而不一定能编译运行的代码。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言实现。(如下图)
通用算法
大多数算法在一定程度上时通用的,例如面包食谱可以做不通口味的面包。排序算法可以对不同内容进行排序。
虽然针对某个具体问题而得出的解决方法也可以视为1个算法,但好的算法是能经历时间的考验,并适用于该问题的任何实例的算法。
请记住程序是算法的实现!为编写程序面设计算法,但算法不是程序。与他人共享算法,分析算法对保证算法的正确性和鲁棒性非常重要。
程序
程序存在于特定的计算机上所运行的特定语言中,算法是对问题解决方案的抽象化,程序就是实际解决方案
程序特征
1、可读性
程序是一个文档,用来描述作者如何解决问题。
程序的两个受众对象:计算机、读者。
要让其他人知道你在想什么,代码应该写得清楚。
程序需要可读取、可理解和对人有用。
难以阅读的代码过一段时间后,连作者本人都难以理解原来的意图,更难得到他人有效的帮助和建议。
那怎么提高可读性呢?
①命名习惯
变量的名字:反映他们的作用,包含一些潜在的信息,例如他们的类型。如sumInt可以知道这是存放和的变量,类型是int
操作的名字,应反映他们要做什么,一级可能的返回值类型。
②注释
注释是可读性的关键。
通常注释会出现在以下位置:
- 说明代码的总体目标,通常作为总结,放置在代码顶部
- 说明对象的目的,例如变量的目的。
- 说明由系统提供的其他函数,或者自己编写的函数。包括需要的输入和输出函数
- 说明“刁钻”或“不寻常”的情况。需要自己思考的地方,应该加以注释。
最后一条规则尤为重要。写代码时遇到了困难,或者难以编写的代码,都需要进行解决,否则将难以阅读。
③代码缩进
正确设置缩进,显示哪些代码是控制语句,对可读性至关重要。
2、鲁棒性
程序在面对不确定性时,需要具备鲁棒性。程序在面对意外的输人信息时能够恢复,例如如果程序要做除法,而除数为零(数学中除数不能为0),程序不应该意外终止。设计的程序应该要能够处理这种错误的输入。
程序运行时可能会出现设计师没有预料到的情况,所以要对意料之外的情况进行恰当处理。
实现鲁棒性要求做到两点:
- 程序设计者应该在设计程序时,考虑到错误发生的情况。特别是,设计者应知道希望得到怎样的输入,并设计1种方法来处理其他情况。
- 设计者应进行测试,确定程序不仅满足最初的设计要求,而且不管对程序做出了哪些修改,都能够处理所有发生的情况(包括出错的情况)。
正确性
设计一个算法,然后用程序实现,程序应该是正确的。
证明正确性是计算机科学中的一个重要分支和研究领域。
现在,能做的就是尽量做最好的设计和测试。