在做lisp解释器的时候发现,eval跟apply函数相互调用,而eval又自身调用自己处理过程类似二叉树遍历,比如跑这个(define (p) (p))
,而后调用(p)
就会堆栈溢出,从backtrace中可以发现都是eval挂了,消除递归目前我知道有四种方法可以消除递归调用:
- 对于普通函数,逻辑上可以修改成循环方式,可以消除递归上的困扰。
- 一定要使用递归的,可以修改成尾递归,或许编译器可以帮你优化,大部分编译器可以做到。
- 对于二叉树类型的递归,因为一个要调用left、right两个分支,而这个有点棘手,我采用的方法是消除其中一个,把它修改成goto