有趣的 Scala 语言: 使用递归的方式去思考
http://www.ibm.com/developerworks/cn/java/j-lo-funinscala1/
在初学计算机编程时,我想大多数人的经历会和作者一样,学校为我们挑选一门语言,大多为 C 或 Java,先是基本的数据类型,然后是程序控制语句,条件判断,循环等,书上会教我们如何定义一个函数,会说程序就是一条一条的指令,告诉计算机该如何操作。同时,我们还会看到如何定义一个递归函数,用来计算阶乘或斐波那契数列。工作以后,其他的这些基础还在日复一日的使用,但递归却很少再被用到,以致我们很难再用递归的方式去解决问题了,为此,我们还有一个借口:递归性能差,使用循环效率高。事实真是这样的吗?我们为自己某种能力的丧失编织了一个美丽的谎言,直到越来越多的编程语言变得流行起来,使我们有机会看到各种语言、各种风格写出的程序,才发现自己应该重新审视递归这一概念了。
//为什么递归会受到忽视
为了回答这一问题,必须先说到编程范式。在所有的编程范式中,面向对象编程(Object-Oriented Programming)无疑是最大的赢家。看看网上的招聘启事,无一例外,会要求应聘者熟练掌握面向对象编程。但其实面向对象编程并不是一种严格意义上的编程范式,严格意义上的编程范式分为:命令式编程(Imperative Programming)、函数式编程(Functional Programming)和逻辑式编程(Logic Programming)。面向对象编程只是上述几种范式的一个交叉产物,更多的还是继承了命令式编程的基因。遗憾的是,在长期的教学过程中,只有【命令式编程得到了强调,那就是程序员要告诉计算机应该怎么做,而不是告诉计算机做什么】。而递归则通过灵巧的函数定义,告诉计算机做什么。因此在使用命令式编程思维的程序中,不得不说,这是现在多数程序采用的编程方式,递归出镜的几率很少,而在函数式编程中,大家可以随处见到递归的方式。下面,我们就通过实例,为大家展示递归如何作为一种普遍方式,来解决编程问题的。