我是计划的新手。我试图以这样的方式截断列表,即新列表不应包含第一个和最后一个元素。
提前致谢。
答案 0 :(得分:2)
有很多方法可以做到这一点,一种可能是使用drop-right
删除最后一个元素,使用rest
(或cdr
)删除第一个元素:
(define lst '(1 2 3 4 5))
(rest (drop-right lst 1))
=> '(2 3 4)
如果解释器中drop-right
不可用,那么只需实现一个过程,该过程返回包含输入列表中所有元素的新列表,最后一个除外。您甚至可以在一个过程中组合删除这两个元素。这是解决方案的一般概念,假设列表至少有两个元素(否则会发生错误) - 填写空白:
(define (truncate-first-last lst)
(define (drop-last lst) ; helper procedure for removing last element
(if <???> ; if the rest of the list is empty
<???> ; then return the empty list
(cons <???> ; else `cons` the first element
(drop-last <???>)))) ; and advance the recursion
(drop-last <???>)) ; call helper, remove first element from list
不要忘记测试它:
(truncate-first-last '(1 2 3 4 5))
=> '(2 3 4)
答案 1 :(得分:1)
你可以这样做:
(define (compose f1 . fn)
(cond ((null? fn) f1)
(else (let ((fr (apply compose fn)))
(lambda (x) (f1 (fr x)))))))
(define truncate-first-last (compose reverse cdr reverse cdr))
> (truncate-first-last '(1 2 3 4))
(2 3)