【问题标题】:How to do this length≤1 more than once?这个长度≤1怎么做不止一次?
【发布时间】:2012-09-15 20:27:54
【问题描述】:

我花了一天时间阅读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

【问题讨论】:

  • 我认为我的 this answer 专门为 length≤2 回答了这个问题(即只有 2 个,而不是更多)。

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


【解决方案1】:

假设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),从而允许计算继续进行。

【讨论】:

  • 使用mk-length 而不是eternity 这将是length≤∞,而不是length≤2
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多