【本文放入 0.2.3函数编程范式 】返回OOD目录
Recursion vs. iteration
C/Java语言教学中,会讲循环/迭代语句;而Scheme会介绍递归。为什么纯函数式编程语言如Scheme不需要迭代结构如while、for呢?为什么纯函数式编程语言如Scheme要用递归而且能够用递归呢?
首先,数据的不变性是纯函数式编程语言的宗教信仰,它们不喜欢变量的值不断地变更,而for(int i=0;i < n;i++)中变量i的值总在变,对于Scheme而言,这是违反其基本价值观的异端。
其次,递归,更一般地,函数的调用,都有创建新的栈帧/stack frame的开销。如JVM为一个Java程序预备的内存有限,Java程序的如果有大量的递归调用将会出现栈溢出错误。如果函数对另外一个函数的调用是尾调用,解释器可以通过尾调用优化/tail-call optimization避免帧的创建。Scheme实现了尾调用优化,所以Scheme的递归函数如果是尾递归,事实上是迭代执行的(SICP1.2.1中比较含混地说明了这一点,尾递归达到Java使用for语句的效果,SICP中称其为“迭代计算过程”);当然,如果Scheme使用