学习指南

考试学习指南

由 Josh Hug 提供,略有修改。

为考试学习是为了获得对材料的熟悉程度,使你能解决不只是重复你已经见过的事情的有趣问题。一些一般提示:

  1. 尽早开始并随着时间的推移分散开来。睡眠会有一些神奇的作用,让事情更好地沉入脑海。更多较短的学习日比少数短的学习日要好得多。事实上,我们布置有截止日期的作业的原因之一就是利用这个事实。
  2. 在学习中尽可能主动。解决问题和制作备忘单是"主动的"。重新观看讲座和重新阅读你已经读过的东西则不是。
  3. 经常缺失的组成部分:反思你自己的问题解决过程。通过与他人讨论,特别是与其他学生讨论(参见下面的建议工作流程),这要容易得多。

给感觉落后的人的建议

如果你对某些讲座感到非常不确定,请尽快观看视频和/或阅读。然后,立即尝试解决指导和讨论讲义上的一些问题。每个讲义都设计为随着你在工作表中深入而难度递增。尝试回答每个部分至少前几个问题。在你工作的过程中,将看似最重要的项目添加到你的备忘单中。

一旦你感觉跟上进度

一旦你了解了基础知识,做阅读、阅读讲座和重新观看讲座不太可能有太大帮助(在我看来)。

更好的方法是解决往年试题上的问题,以及指导和讨论讲义上的问题。

甚至更好的方法是在尝试解决问题后仔细反思你的解决过程。这在周围有其他人时更容易做到。

我建议的考试学习方法如下:

  1. 组成一个小型学习小组。
  2. 定期会面,就每次会议前每个人都应该尝试的一组问题达成一致。
  3. 在每次会议上,让每个人引导小组完成他们自己对其中一个问题的解决方案。其他人都应该插入他们的想法。看到你将发现什么捷径或低效可能会相当有启发性。重复直到你涵盖了所有问题,每个人都有机会发言。

我在研究生院为我那令人难以置信的困难的研概率和统计课程做了这个,我当时真的希望我早点发现这个过程。你的 mileage 可能会有所不同。

理想情况下,这个小组应该在整个学期中见面,而不仅仅是在考试前的几天。

解决问题

基于 Loksa, Ko, et al. 的原始研究

重新解释问题提示

阅读 并重新解释 问题。通常,我们从一个要解决的问题的描述开始。重要的不仅仅是阅读问题,而是批判性地思考问题中细节的含义并澄清任何歧义。当我们直接跳入编码而没有首先思考问题并为我们自己提出问题時,我们经常遇到我们卡住的场景,需要问我们自己,"我应该在这里放什么?"或"正确的循环结束条件是什么?"这增加了认知负荷,要求我们上下文切换并从问题中移除我们自己,而我们回答一个侧面问题。

在任何问题上要问自己的几个具体起始问题包括:

  • 程序的 (输入)和 范围(输出)是什么?
  • 用你自己的话重述程序的预期行为。
  • 随着程序执行,这个程序中的值将如何变化?

通过研究文档测试来验证你的理解。在计算机科学中,问题的心理表征通常与其解决方案密切相关。

大提示总是在文档测试中给出! 文档测试告诉我们解决方案的形状和格式。如果我们足够仔细地查看文档测试中的模式,我们通常会暴露问题应该如何解决的结构中的细节。

虽然它们提供了许多提示,但文档测试并不详尽,它们通常不显示最重要的情况。开发至少涵盖以下情况的示例:

  • 我可以给这个函数的最小或最简单的输入是什么?
  • 是否有类似的小输入对这个问题是 无效 的?它与早期情况有什么关系或有什么不同?
  • 我们能想出任何与较小情况相关或依赖较大情况的程序的较大输入吗?这个想法是想出一些我们可能必须使用递归或其他技术解决的子问题。

搜索类似问题

这个问题看起来和你以前见过的东西相似吗?凭借你在作业、实验和讨论中的经验,制定一个如何解决这个问题的总体思路。

一旦我们确定了一个类似的问题,我们就可以提取解决这个问题的总体策略。虽然细节很有用,但从类似问题中复制和粘贴解决方案通常不会让我们走得很远。相反,通过问"包含这段代码目的是什么?"来用语言表达代码并用英语重新解释它。

调整以前的解决方案

通过应用你学到的问题解决技术和你处理类似问题的经验来实现解决方案。例如,对于递归,尝试遵循找到基本情况、识别递归调用然后组合结果的步骤会有所帮助。然而,代码中的特定实现将取决于问题的具体细节。

这是我们对问题的严格理解派上用场的地方。我们找到了一个具有相似但不完全相同的行为的类似问题,所以我们心中有一个 一般方法。我们知道正确程序中的域、范围和行为。使用在课堂上学到的 问题解决技术将一般方法应用 到特定问题,以提出一个朝着解决方案迈出一步的初稿。

它可能不完全正确,但这很好,也完全正常;完善问题的心理表征需要时间和练习。

评估解决方案

分析并测试由此产生的实现。我们想要回答两个核心问题:

  1. 我的方法在正确的轨道上吗?如果没有,也许我们应该考虑另一个类似的问题。
  2. 如果我的方法方向正确,让我们评估 并验证解决方案的正确性。

要改进我们的代码,我们只需要问自己正确的问题。什么输入会破坏程序?像 Python 一样思考:逐步运行代码直到出现问题。我们有输出应该看起来像什么的示例,所以确保实际结果与预期相符。

如果结果不一致,让我们尝试通过提出更具体的问题来确定为什么并进行调整。问题的根源在哪里?让我们回溯代码以找到问题的根源。然后,一旦我们找到了问题,让我们尝试搜索类似问题的相同方法,除了在这个特定的子问题上。