A-level 计算机科学/OCR/单元 2.2 问题解决与编程
计算机专业人士已经开发出各种技术来解决现实世界中的问题,并创建基于计算机的解决方案。计算思维是指利用这些技术来解决问题,无论是否使用计算机。其原理是将一个复杂的问题转化为可以理解、正式表示和解决的问题。这种思维过程很重要,因为世界上一些最大的问题非常复杂,难以理解。软件编写也具有挑战性,希望从软件开发中吸取的教训可以更广泛地应用于提供解决方案。
顺序
按顺序执行一条语句。
迭代
多次执行一组语句。
迭代可以是“计数控制”或“条件控制”。计数将重复该部分 n 次,条件将在满足条件之前停止迭代。
分支/选择
根据条件执行一组指令,例如 If ... Else。
局部
在模块/函数/子例程中声明,仅在其中可用。子例程结束时被销毁。
全局
在程序顶部,子例程之外声明。可以在程序中的任何位置使用。程序结束时被销毁。
在声明它的子例程中使用时,与全局变量同名的局部变量优先使用。
因此,应尽可能使用局部变量,因为它们使用更少的内存,因为它们是在其子例程中创建和销毁的。
函数和过程接受零个、一个或多个参数,并执行一项特定任务。然后函数返回一个值,而过程不返回任何值。
传递参数
按值:传递将用于函数的值。
按引用:传递将用于函数的值的位置。
按引用传递的变量可能会在处理过程中被程序的另一部分更改。
在考试中,除非另有说明,否则伪代码中的值按值传递。
帮助程序员进行编程的程序。
IDE 可以提供许多功能,例如
- 调试器
- 代码编辑器
- 翻译器
- 集成运行时环境
- 自动文档
- 语法高亮
- 语法检查
- 自动代码补全
- 自动缩进
- 项目导航面板
- 错误诊断
递归是指子例程(例如函数)调用自身。
它必须包含一个停止条件,如果没有停止,它必须调用自身,停止条件必须在有限数量的循环中可达。
递归与迭代
- 递归的内存效率不高
- 递归发生的地方必须存储在一个堆栈中,以便在满足停止条件后可以“展开”。这可能会占用大量内存,甚至会导致计算机内存不足,并导致程序崩溃。
从历史上看,许多问题都是通过应用数学解决的,无论是否已知物理规律。例如,绘制飞往月球的路线,或估计建造一艘船所需的金属。在这些情况下,可以使用计算和收集的数据获得相当准确的解决方案。如果数据的质量很差或应用的数学无法反映现实世界,就会出现问题。
许多必须解决的问题不太可能接受可靠的解决方案。由于对潜在问题理解不正确,数据不足或不正确,或潜在问题过于复杂,并非所有问题都易于描述。当人们认为自己理解了这些问题时,它们就会造成麻烦。这会导致糟糕的解决方案,这些解决方案无法解决问题,甚至可能使情况变得更糟。复杂问题包括生物和生态系统、气候和社会模型。
在所有这些情况下,纯粹的复杂性都克服了正常的科学和数学方法。解决复杂问题的帮助将来自计算思维,并且它已经做到了——使用鸟枪法测序算法拼凑人类基因组的结构就是一个例子。
更常见的是,可以通过应用算法来解决难题。这些算法很有帮助,因为教计算机解决问题的方法有助于理解问题。现代计算机系统可以快速执行算法解决方案,并且可以采用试错法。算法思维遵循四个阶段
- 理解问题——这可能是一个严重的问题——我们如何判断一个问题是否已被充分理解?
- 拟定问题——生成问题的简洁表示。通常涉及抽象和数学解决方案。
- 设计算法——一旦获得明确的表示,就可以设计一个算法来应用这种表示。
- 实现算法——编写一个可以实现该算法的程序。
- 运行并解决问题——运行代码并查看它是否有效。根据要求评估输出。
这是一种问题解决方法,它从更大的图景开始。然后将其分解为子问题,这些子问题可以表示为黑盒子——细节留到以后处理。
这是一种将大型程序划分为模块的方法。每个模块解决一个问题,然后将所有模块组合在一起。这种方法得到了以下认识的支持:所有程序都倾向于由序列、迭代和选择组成。
OOP 是另一种经常使用分解来解决编程问题的途径。对象由包含代码和数据的独立程序单元组成。然后可以将这些单元组合在一起形成完整的解决方案。这些对象是抽象的示例,可以在修改或不修改的情况下使用。
编写算法的目的是产生一个能够解决问题泛化表示的过程,使其能够解决类似的问题。为了生成一个好的算法,必须确定它是正确且有效的。证明算法不正确可能很简单——只需要在一个案例中证明它失败即可。证明它是正确的则要困难得多。有时问题过于复杂,必须接受一个足够好的解决方案。