比较两种类型的延迟计算

时间:2015-03-29 16:45:53

标签: recursion lambda scheme racket

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

类型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)))))))) 

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

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

答案在于这两个lambdas:

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

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

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