比较两种类型的延迟计算

Comparing two types of delayed computation

我有一个作业需要使用两种类型的延迟计算来解释对内存的影响。代码解决了hanoi问题

类型 1:

(define count-4 (lambda (n) (count-4-helper n (lambda (x) x)))
(define count-4-helper (lambda (n cont)
 (if (= n 1)
 (cont 1)
 (count-4-helper (- n 1) (lambda(res) (cont (+ 1 (* 2 res)))))))) 

类型 2:

(define count-5 (lambda (n) (count-5-helper n (lambda () 1)))
(define count-5-helper (lambda (n cont)
 (if (= n 1)
 (cont)
 (count-5-helper (- n 1) (lambda() (+ 1 (* 2 (cont)))))))) 

第一种情况是延迟计算的经典语法。第二种情况是一样的,只是它没有得到任何参数,只是 returns 初始值。 问题是这些函数中哪一个是尾递归的?(我认为它们都是)。它们的内存消耗有何不同?第二种应该更有效,但我真的无法解释。

感谢您的宝贵时间。

答案在这两个 lambda 表达式中:

(lambda (res) (cont (+ 1 (* 2 res))))

(lambda () (+ 1 (* 2 (cont))))

在其中一个而不是另一个中,cont 在相对于 lambda 的尾部位置被调用。