Scheme - 截断列表

时间:2013-04-14 00:04:09

标签: list scheme

我是计划的新手。我试图以这样的方式截断列表,即新列表不应包含第一个和最后一个元素。

提前致谢。

2 个答案:

答案 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)