3.5 【小白也要懂】如何构造程序逻辑

到本节为止,我们已经掌握了许多Python的核心元素,包括变量、数据类型、运算符、表达式、条件分支结构和循环结构等。

但是对于程序设计的小白来说,很难充分利用这些已经掌握的知识去解决现实中的问题,换句话说,就是缺乏把人类自然语言描述的解决思路翻译成Python代码的能力。那怎么才能提高这种“翻译”能力呢?通过大量的练习是可以达到培养这种思维能力的目的,至少能提高复制能力。如果能进一步从大量的练习中归纳出属于自己的方法论,那效果会事半功倍。

这里介绍一种比较通用的方法论。

遇到问题,先要将问题细分,把大问题分解成为若干小问题,其中有些小问题如果有成熟的解决方案,就直接拿来用。关于剩下那些没有解决方案的小问题,我们需要审题,就像做数学题一样,把已知条件都写下来,根据条件去寻找线索和规律。必要时,甚至可以用穷举法罗列下所有的计算结果,然后从结果中倒推规律。没有人天生就会编程。计算机工程师和科学家们总结了很多解决问题的方法,也可以称之为算法。学习编程不是自己从头发明算法,而是站在巨人的肩膀上,使用科学家总结出来的方法,再进行组合或微调,找到解决问题的思路。

这里让我们用案例来展示具体的分析思路。

1)算法题目一:一个整数,它加上100和加上268后都是一个完全平方数,请问该数是多少?

分析思路:我们拿到题目,首先要分析所有的条件。

条件一,它是整数,属于int类型。

条件二,它加上100是个平方数,我们可以用x代表这个平方数。

条件三,它加上268也是一个平方数,这里用y来代表这个平方数。

条件二和条件三要同时成立,也可以理解为条件二和条件三的布尔返回值必须为True。

有了这些条件,就可以写出逻辑程序,然后用不同的数值去尝试。

例3-17 整数加上100和加上268后都是一个平方数

这种问题的算法相对简单,但是充分体现了前面提到的分析思路的优点。

2)算法题目二:寻找水仙花数。水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,该数字每个位上数字的立方之和正好等于它本身,例如:$1^3+5^3+3^3=153$。

思路分析:假设水仙花数为i=153,那么个位数字为print(i%10),十位数字为print(int(i/10)%10),百位数字为print(int(i/100))。

例3-18 水仙花数

通过整除和求模运算分别找出了一个三位数的个位、十位和百位。

3)算法题目三:百钱百鸡问题。百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?

思路分析:很明显这是一个多元方程,公鸡数量为x,母鸡数量为y,小鸡的数量为z。而且用100块钱买一百只鸡,可以写成数学方程x+y+z=100和5x+3y+z/3=100。答案有很多种,用数学方法计算起来很费力,但是用计算机就会轻松很多。列举解决方案中所有可能的候选项并检查每个候选项是否符合问题的描述,最终得到问题的解。这种方法看起来比较笨拙,但对于运算能力非常强大的计算机来说,通常这都是一个可行的甚至是不错的解决方案。

例3-19 百鸡百钱

这种方法就是穷举法,也称为暴力搜索法。编程虽不用像乐器一样需要肌肉记忆,但同样需要对常用“套路”的熟悉,才能在使用时信手拈来。另一方面,只有去积极面对实际的问题,才会倒逼我们思考解决问题的“大局观”,以及如何流程化、模块化地实现我们需要的功能。