结论:在惰性求值的情况下,尾递归一定程序上失效。
虽然在递归计算的时候,尾递归还是发挥了作用,但这种计算过程的延迟在真正需要值的时候将表现出和非尾递归一样的计算状态的保存,不过这种状态的保存与尾递归要消除的目标是不一样的,只是一种同构。
举例子来说,fun的时间复杂度只是线形的,但计算200以上的数字时候算不出来,这是递归太深的原因,而fibs是指数级的,在11,12还能算出来,这是递归不深,而对于较大的数算不出来是因为算法复杂性。
(defun fixpoint ( x y)
(funcall y (funcall x x y) )
)
(setq fun (fixpoint 'fixpoint
(lambda (s)
(lambda (n)
(if (> n 0)
(+ n (funcall s (- n 1) ) )
1
)
)
)
)
)
(setq fibs (fixpoint 'fixpoint
(lambda (s)
(lambda (n)
(if (> n 0)
(+ (funcall s (- n 2) ) (funcall s
(- n 1) ) )
1
)
)
)
)
)
(funcall fibs 10)
(funcall fibs 11)
(funcall fibs 12)
(funcall fibs 13)
(funcall fibs 14)
(funcall fibs 15)