初学者写程序

来源:互联网 发布:php class 魔术方法 编辑:程序博客网 时间:2024/05/21 19:38

前几天,一个学生问我,看着程序题的答案明白,但是自己写不出来怎么办。其实,即使不仅仅是写程序,我们在学习很多科目时,都会遭遇这样的问题。例如,我们要写一篇“家乡”的作文,不知如何开展,然后我们去看“范文”,也看得很愉快,但是脱离范文,发现自己写依然没有太多头绪。数学中也会有这样的情形,我们不会做一道题,然后看了答案,尽管看答案时内心如明镜,但是自己把答案写出来依然困难。当能回忆起如此总总,你会发现,这并不是写程序会遇到的问题,而是学习中常见的问题。这种情形一般是因为该类问题需要较多的步骤,即使我们学习了相应的基础知识,也无法短时间就具备能够调动解题步骤的每一个需要的知识点。人脑并不善于一口气解决一个复杂的问题。因此我们通常需要寻找突破口。找到突破口,我们就能够把问题简化,而简化的过程,也正是把未知的问题变成已知问题的过程。

这位学生问的问题并不是复杂的问题。她的问题是,“删去顺序表中最小的元素,并以最后一个元素代替”。当然,这可能对初学者而言已经是复杂的问题了。在我们学习顺序表的基本操作时,删除是一定会学习的操作。但我们通常学习的是删除某个固定位置上的元素或者值为key的某元素。不管我们是否记得删除的具体细节,但我们只要还对删除操作有印象,就容易想到要用到删除操作的知识。而在删除之前呢,由于我们并不事先知道哪一个元素是最小的,因此我们需要遍历查找最小的元素。所以,这个问题实质上就变为两个熟悉的问题,就是查找一个元素并删除它。其实到此,原问题已经被拆分了。我试着告诉学生,如果你认为自己当前暂不具备写出完整代码的能力,那就尝试解决这两个子问题。而且,在解决子问题时,只写出最核心的步骤,而不是考虑所有的细节。我们可以先看查找过程。她不知道应该定义几个变量,这倒也不奇怪。既然是确定要找最小的元素,是不是需要一个变量来标记最小元素的位置,才能够做删除操作。学生一下子能明白,由于最小元素是未知的,因此需要一个变量。到此,她就大概能写出查找的代码了。至于删除,大多数人都知道元素要移动这一点。但对于初学者而言,他并不是不知道元素要移动,而是不能记忆起如何移动,从哪里开始移动,边界值是什么。换句话说,在他们脑海里,精确记忆的细节早已经忘记,深怕写出来的代码错过了一个特例的运行。而这种担心是没有必要的。细节不是不重要,但首先重要的是主体。主体反映问题的本质。其实移动的过程就是a[j] = a[j+1],除此之外,还应该注意什么呢。从哪儿开始移动是不是也是一个问题呢?是不是从要删除的元素的后一个位置开始移动。之所以这样移动,是因为每次覆盖的位置上的值已经不需要了。只要掌握了这两点,删除的核心代码是一定能写出来的。

在学习解决复杂问题时,都可以采用这种拆解问题的思路。那么我们就可以将复杂的问题变为相对简单的问题。只要我们拆解出来的简单问题我们能够解决,那么对应的复杂问题就迎刃而解了。

1 0