陈颂光
全栈工程师,能够独立开发从解释器到网站和桌面/移动端应用的各类软件。
关注我的 GitHub

怎样解题

波利亚在《怎样解题》中给出一个怎样解题表,虽然它面向的是数学的领域,但后来被发现在编程上也有其方法论意义。

第一,你必须弄清问题##

弄清问题###

  • 未知数是什么?
  • 已知数据(指已知数、已知图形和已知事项等的统称)是什么?
  • 条件是什么?
  • 满足条件是否可能?
  • 要确定未知数,条件是否充分?
  • 或者它是否不充分?或者是多余的?或者是矛盾的?
  • 画张图。
  • 引入适当的符号。
  • 把条件的各个部分分开。你能否把它们写下来?

第二,找出已知数与求知数之间的联系##

  • 如果找不出直接的联系,你可能不得不考虑辅助问题。
  • 你应该最终得出一个求解的计划。

拟定计划###

  • 你以前见过它吗?你是否见过相同的问题而形式稍有不同?
  • 你是否知道与此有关的问题?你是否知道一个可能用得上的定理?
  • 看着未知数!试想出一个具有相同未知数或相似未知数的熟悉的问题。
  • 这里有一个与你现在的问题有关,且早已解决的问题,你能应用它吗?
  • 你能不能利用它?你能利用它的结果吗?为了能利用它,你是否应该引入某些辅助元素?
  • 你能不能重新叙述这个问题?你能不能用不同的方法重新叙述它?
  • 回到定义去。
  • 如果你不能解决所提出的问题,可先解决一个与此有关的问题。你能不能想出一个更容易着手的有关问题?一个更普遍的问题?一个更特殊的问题?一个类比的问题?你能否解决这个问题的一部分?仅仅保持条件的一部分而舍去其余部分,这样对于未知能确定到什么程度?它会怎样变化?你能不能从已知数据导出某些有用的东西?你能不能想出适合于确定未知数的其它数据?如果需要的话,你能不能改变未知数和数据,或者二者都改变,以使新未知数和新数据彼此更接近?
  • 你是否利用了所有的已知数据?你是否利用了整个条件?你是否考虑了包含在问题中的所有必要的概念?

第三,实行你的计划##

实现计划###

  • 实现你的求解计划,检验每一步骤。
  • 你能否清楚地看出这一步是正确的?你能否证明这一步是正确的?

第四,验算所得到的解##

回顾反思###

  • 你能否检验这个论证?你能否用别的方法导出这个结果?你能否一下子看出它来?
  • 你能不能把这结果或方法用于其它的问题?
关键词 方法论