【发布时间】:2015-06-08 18:19:34
【问题描述】:
在The little schemer一书中,我们发现这个函数只支持长度小于或等于1的列表:
(((lambda (mk-length) ; A.
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l ) 0)
(else (add1 ((mk-length eternity ) (cdr l))))))))
'(1))
我想一步一步学习,想写一个类似的函数,只支持长度小于等于2的列表。
请不要通过提供以下代码来回答这个问题:
(((lambda (mk-length) ; B.
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0 )
(else (add1((mk-length mk-length) (cdr l))))))))
'(a b c d))
因为这个函数支持任意长度。
而且我已经知道如何编写这样的函数:
(((lambda (mk-length) ; C.
(mk-length
(mk-length (mk-length eternity))))
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l))))))))
'(1 2)) ;;
实现我的目标。但是这段代码距离第一个sn-p还不止一步。
也许,我不应该改变:
(lambda (mk-length) ; D.
(mk-length mk-length)
【问题讨论】:
-
问题到底是什么?此外,您可能会在答案(或链接的问题)中找到答案:Little Schemer: length0 and mk-length。我不会将其标记为重复,因为我不确定你在这里问的到底是什么。
-
我的意思是做与我在这里粘贴的第三个代码相同的事情。但应该来自第一个代码的想法。这意味着不要在第 1 个代码中更改第 4 个代码。
-
您能否提供有关为什么您正在寻找这个的任何见解。这实际上是一个不平凡的问题,因为这种递归练习的重点是,由于列表是递归数据结构,因此您只需要处理两种情况:空列表和非空列表。
-
第二个代码只需将
(mk-length eternity )改为(mk-length mk-length),即可实现任意长度。很难想,所以我想实现一个只是<=2的版本。在第一个代码的基础上 -
这是this question 的副本,但那里的答案是
length≤∞,而不是length≤2。
标签: recursion scheme y-combinator the-little-schemer anonymous-recursion