班号:SW050727
今天是一节补充教学,隔了三个多月又见面,我和学生们都感觉很兴奋,不过班里只来了7个人,这让班主任阎老师很是气恼,本来是学生要求补习的,却只来了这么几个人。
文归正题,今天的内容是递归函数,这是第一次讲授这样的内容,以前学编程的时候,对递归没有太深的研究,只是会写递归程序,能看懂,能用递归程序解决实际问题而已,而教学就不能只掌握得这种水平了,于是白天对递归进行恶补。这个班开C语言的时候我没有讲授递归的内容,直接跳过去了,只是在上机的时候给几个学有余力的学生进行了单独辅导,因为我觉得递归这个东西对于初学编程的人来说不太容易理解,应该在学生对编程有了一定的了解,不再有恐惧心理的时候再来讲,就清华软件工程师的教学体系来看,应该放在C++或者Java的课程里面来讲会比较好一些。(不过学生们太郁闷了,C++的主讲竟然是个不负责任的“递归狂”。)
在白天的“恶补”过程中,在网上看到一篇文章提出了一个很新颖的观点,它提出递归应该是一种结构而不是所谓“递归函数”,这就是我说得在会使用、能懂懂之外的研究,一般教材中(不论是C语言还是其他什么语言)会把递归放在函数一章的最后一节,名曰“递归函数”,不能否认,实现递归的函数确实应该叫做“递归函数”,但是至于递归本身,我认为也应该是一个基于函数的结构,我们常说面向过程的编程有三种基本结构:顺序、分支、循环;我认为是不是递归可以跻身第四种结构或者说基本结构?因为实际上我们在探讨高级递归应用的时候,总会提到,用递归的程序都可以用迭代(其实也就是循环)的方式代替,而所有的循环程序也都可以改写成递归,这两者之间的转换只是一个程序设计难度、易读性以及程序执行效率的问题。
实际上递归时有弱点的,我们一般的教材上对递归的弱点往往都采取了回避的态度,我个人是不赞同大量使用递归的,因为递归程序往往缺乏易读性,而且编写困难,最重要的是,递归的致命弱点在于大量占用内存,越是复杂的递归结构占用内存越多(每次递归都要保存现场、转去执行新的函数),这在其他结构中是不会出现的,当然,递归有时候可能能够以空间换时间,这是递归存在的理由,在软件工程当中,空间复杂度和时间复杂度都是讨论算法优劣的因素。我在课上给学生的是:对于递归,初学的时候以了解为主,尽量不要去碰,等到自己有了数年的工作经验,再去自己判断遇到的问题是应该用递归还是循环为佳。
对于递归的一些探讨
最新推荐文章于 2024-07-22 09:38:37 发布