消除递归溢出的办法

在做lisp解释器的时候发现,eval跟apply函数相互调用,而eval又自身调用自己处理过程类似二叉树遍历,比如跑这个(define (p) (p)),而后调用(p)就会堆栈溢出,从backtrace中可以发现都是eval挂了,消除递归目前我知道有四种方法可以消除递归调用:

  • 对于普通函数,逻辑上可以修改成循环方式,可以消除递归上的困扰。
  • 一定要使用递归的,可以修改成尾递归,或许编译器可以帮你优化,大部分编译器可以做到。
  • 对于二叉树类型的递归,因为一个要调用left、right两个分支,而这个有点棘手,我采用的方法是消除其中一个,把它修改成goto方式,这样可以避免溢出。
  • 还有一种方法,弹跳床技术,好像很多lisp实现用了这个方法,它就是在尾递归的基础上做的,把尾递归改称循环。

  1. 谢谢大哥哥了 @_@
  2. 一次回复
    1. 哈哈,刀子你来了。