前言
众所周知,递归函数容易爆栈,究其原因,便是函数调用前需要先将参数、运行状态压栈,而递归则会导致函数的多次无返回调用,参数、状态积压在栈上,最终耗尽栈空间。
一个解决的办法是从算法上解决,把递归算法改良成只依赖于少数状态的迭代算法,然而此事知易行难,线性递归还容易,树状递归就难以转化了,而且并不是所有递归算法都有非递归实现。
在这里,我介绍一种方法,利用CPS变换
,把任意递归函数改写成尾调用形式,以continuation
链的形式,将递归占用的栈空间转移到堆上,避免爆栈的悲剧。
需要注意的是,这种方法并不能降低算法的时间复杂度,若是指望此法缩短运行时间无异于白日做梦
下文先引入尾调用、尾递归、
延伸阅读
学习是年轻人改变自己的最好方式