比较两种类型的延迟计算
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 的尾部位置被调用。
我有一个作业需要使用两种类型的延迟计算来解释对内存的影响。代码解决了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 的尾部位置被调用。