2014-09-19 128 views

回答

2

这里有一个办法做到这一点,使用球拍的内置程序:

(define my-list '(1 2 3 4 5 6 7 8 9 10)) 

(drop-right (rest my-list) 1) 
=> '(2 3 4 5 6 7 8 9) 

注:我们可以用cdr代替rest,但rest在Racket中比较惯用。对于更一般的解决方案:

; remove `left` number of elements elements from the left side 
; and `right` number of elements from the right side of the list 
(define (trim lst left right) 
    (drop-right (drop lst left) right)) 

(trim my-list 1 1) 
=> '(2 3 4 5 6 7 8 9) 

(trim my-list 2 4) 
=> '(3 4 5 6) 
0

您呈现的方法使用了一些内存,因为它会导致当您再次将其倒转过程中丢弃的单元格。然而Óscars解决方案也会影响n个单元,因此它可能有助于清晰度,但它肯定不会更快。

在一个500万元素的列表中,编译时(在我的机器上)大约需要1,6秒,而且这通常是gc时间。如果您发现有性能问题,你在写方案(不拍语言),你可以通过做一个合格的手动尾递归模利弊得到它的4倍的速度(400毫秒):

#!r6rs 
(import (rnrs) 
     (rnrs mutable-pairs)) 

(define (middle lst) 
    (define head (list 1)) 
    (let loop ((tail head) (lst (cdr lst))) 
    (if (and (pair? lst) (pair? (cdr lst))) 
     (begin 
      (set-cdr! tail (list (car lst))) 
      (loop (cdr tail) (cdr lst))) 
     (cdr head)))) 

正如你可以看到它是相当难看,所以你必须真正想要更多的性能来取代2个反转和2个cdr。

相关问题