我試圖刪除球拍中列表的第一個和最後一個元素。是否有這樣做的,而不是這個的一些其他的方式:如何刪除列表的第一個和最後一個元素?
(cdr (reverse (cdr (reverse my-list))))
我試圖刪除球拍中列表的第一個和最後一個元素。是否有這樣做的,而不是這個的一些其他的方式:如何刪除列表的第一個和最後一個元素?
(cdr (reverse (cdr (reverse my-list))))
這裏有一個辦法做到這一點,使用球拍的內置程序:
(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)
您呈現的方法使用了一些內存,因爲它會導致當您再次將其倒轉過程中丟棄的單元格。然而Ó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。