0

我是新来的计划。我正在尝试以新列表不应包含第一个和最后一个元素的方式截断列表。

提前致谢。

4

2 回答 2

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)
于 2013-04-14T00:09:34.153 回答
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)
于 2013-04-14T03:24:24.220 回答