2014-09-19 125 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。

相關問題