怎么做这个长度≤1不止一次?

时间:2012-09-24 11:22:09

标签: recursion scheme y-combinator the-little-schemer anonymous-recursion

我花了一天时间阅读 The Little Schemer 一书中的第166页length≤1;有以下代码:

(((lambda (mk-length)
    (mk-length mk-length))
  (lambda (mk-length)
   (lambda (l)
    (cond
      ((null? l) 0)
      (else (add1 
           ((mk-length eternity)
            (cdr l))))))))
 l)

其中l(apples)eternity如下:

(define eternity 
  (lambda (x)
    (eternity x)))

第166页(第4版)指出:

  

当我们应用mk-length一次时,我们会获得length≤1

然后

  

我们能不止一次这样做吗?

但我不知道如何才能获得length≤2

1 个答案:

答案 0 :(得分:3)

假设l(apples oranges),那么它会像这样评估(请注意mk-length绑定到(lambda (mk-length) ...)函数本身:

(cond ((null? l) 0) 
      (else (add1 ((mk-length eternity) (cdr l)))))
==>
(add1 ((mk-length eternity) '(oranges)))
==>
(add1 ((lambda (l) (cond ((null? l) 0
                          (else (add1 ((eternity eternity) (cdr l))))))))
==>
(add1 (add1 ((eternity eternity) '())))

所以在这里,经过两个步骤,eternity最终被应用,但我们想要的是它调用mk-length。因此,在原始函数中,如果我们将eternity替换为mk-length,那么我写的最后一步将包含(mk-length mk-length)而不是(eternity eternity),从而允许计算继续进行。