我有一个任务,我需要使用两种类型的延迟计算来解释对内存的影响。该代码解决了河内问题。
类型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))))))))
第一种情况是延迟计算的经典语法。第二种情况是相同的,只是它没有得到任何参数,只返回初始值。 问题是这些函数中的哪一个是尾递归的?(我认为它们都是)。他们的记忆消耗有多大不同?第二个应该更有效,但我无法解释。
感谢您的时间。
答案 0 :(得分:0)
答案在于这两个lambdas:
(lambda (res) (cont (+ 1 (* 2 res))))
(lambda () (+ 1 (* 2 (cont))))
在其中一个而不是另一个中,cont
在相对于lambda的尾部位置被调用。