Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何删除列表的第一个和最后一个元素?_List_Scheme_Racket - Fatal编程技术网

List 如何删除列表的第一个和最后一个元素?

List 如何删除列表的第一个和最后一个元素?,list,scheme,racket,List,Scheme,Racket,我试图删除Racket中列表的第一个和最后一个元素。是否有其他方法来代替: (cdr (reverse (cdr (reverse my-list)))) 这里有一种方法,使用Racket的内置程序: (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在球拍中更为惯用。对于更一般的解决方案: ; re

我试图删除Racket中列表的第一个和最后一个元素。是否有其他方法来代替:

(cdr (reverse (cdr (reverse my-list))))

这里有一种方法,使用Racket的内置程序:

(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
在球拍中更为惯用。对于更一般的解决方案:

; 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)

您介绍的方法使用了一些内存,因为它包含n个单元格,当您再次反转它时,这些单元格会在过程中被丢弃。然而,Óscars溶液也会抑制n细胞,因此它可能有助于澄清,但肯定不会更快

在500万元素列表中,编译(在我的机器上)大约需要1,6秒,这大部分是gc时间。如果您发现您有性能问题,并且正在编写scheme(而不是racket语言),您可以通过执行单程手动尾部递归模cons,将其速度提高4倍(400ms):

#!r6rs
(进口(rnrs)
(rnrs可变对)
(定义(中间lst)
(定义标题(列表1))
(让回路((尾部)(lst(cdr lst)))
(如果(和(对?lst)(对?(cdr lst)))
(开始
(设置cdr!尾部(列表(车辆lst)))
(循环(cdr尾部)(cdr lst)))
(cdr负责人)
正如你所看到的,它非常难看,所以你一定真的想要更高的性能来替换2个反转和2个CDR