在The Little Schemer book的第 9 章中,在为任意长输入构建length函数时,建议如下(在第 170-171 页),在以下代码片段中(来自第 168 页本身):
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
((lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))
(mk-length mk-length))))
part (mk-length mk-length), 将永远不会返回,并将无限地应用于自身:
因为我们只是
mk-length一次又一次地向自己申请......
和
但是现在我们已经
(mk-length mk-length)从使它length不再返回函数的函数中提取出来了。
现在,为了解决这个问题,本书建议:
将
mk-length我们最后一个正确版本 of 中 to 自身的应用length变成一个函数。
就像,所以:
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
((lambda (length)
(lambda (l)
(cond
((null? l) 0 )
(else
(add1 (length (cdr l)))))))
(lambda (x)
((mk-length mk-length) x)))))
我感到困惑的是:
如果
(mk-length mk-length)不返回函数
我们如何将结果应用
(mk-length mk-length)到某个东西上,就好像它是一个函数一样?(lambda (x) ((mk-length mk-length) x))包装
(mk-length mk-length)成函数如何解决“永不返回”(即无限递归)问题?我的理解是,在:(lambda (x) ((mk-length mk-length) x))
x只会被传递给永远不会返回的无限递归函数。