一个真实的例子
虽然Fibonacci数的例子能够体现出递归和非递归函数在代码数量上的区别,但是Fibonacci数在Web应用开发中却毫无用处。列表D提供了一个更有实用性的递归例子——一个多维数组排序的递归函数。
这是一个用JavaScript实现的快速排序算法,于1960年由C.A.R.Hoare发明。快速排序算法将数组分成两部分,分别对它们排序。每个部分又用快速排序算法来排序,一直这样进行下去,最后就实现了排序。这里要注意JavaScript将数组作为对象,因此传递给函数的是引用,所以对数组的任何改变都会改变其本身而不是一份拷贝。
递归的能力
如果一个问题能够通过解决更小的相同得问题来解决,递归的作用就体现出来了,上面的函数就是这样。某些程序用递归很容易描述,比如剖析一份XML文档。一份实用的成形的XML文档是树形结构的。它典型地可以被分成更小的相同的问题。可以截断树的横向结构来检查当前节点,对于树中每个子节点也是这样。
递归的弱点
光鼓吹递归的优点而不提及它的不足是不可取的。首先,进行递归式的思考需要练习。虽然迭代能很自然得出,然而递归却不是。其次,递归需要很多资源。每次递归函数调用都相当于一次非递归函数调用。第三也是最重要的一点,就是堆栈。堆栈被用来存储函数调用者的状态,以便当函数结束后,能够将此状态返还给调用者。当试图将调用者状态压栈却发现堆栈空间已耗尽时就会产生一个堆栈溢出错误。
总结
在Intetnet刚出现的时候,内存空间十分有限,调制解调器的速度也非常慢。紧缩编写的代码是保留资源的一个方法。今天,资源已经不像过去那样紧张了,但是没有理由抛弃紧缩编写的代码。即使作为一个高级概念,递归还是能被用来减少JavaScript函数的体积。
