如何从Scheme?
中删除列表中的第一个元素假设我有以下列表
'((apple bob car) (cat dig) (e)))
我如何摆脱apple
而将其余部分单独留下?
答案 0 :(得分:9)
Scheme中的三个基本列表操作是
cdr
,意思是'休息'或'给我列表,没有第一项'car
,表示“第一个”或“给我列表中的第一个项目”cons
,表示追加列表假设s是列表((apple bob car)(cat dig)(e))
中间步骤
(car s) ; (apple bob car)
(cdr (car s)) ; (bob car)
(cdr s) ; ((cat dig) (e))
最后的表达
(cons (cdr (car s))) (cdr s))
结果
((bob car) (cat dig) (e))
答案 1 :(得分:5)
首先,要认识到你的问题有点不一致。如果你想删除列表中的第一个元素,你将留下
((cat dig) (e))
因为列表中的第一个元素是(apple bob car)
。
如果你试图摆脱apple
,那么如果列表的头部(汽车)本身一个列表,你想用它的cdr替换它。我假设您希望无论列表的深度如何都能工作,因此您需要使用该方法进行递归(与其他答案不同)。
因此,如果第一个项目是列表,那么您需要从列表中删除第一个项目,并递归地将其添加到列表的其余部分。这似乎有效:
(define removeFirst
(lambda (input)
(cond
((list? (car input)) (cons (removeFirst (car input)) (cdr input)))
(else (cdr input))
)
)
)
> (removeFirst '((apple bob car) (cat dig) (e)))
((bob car) (cat dig) (e))
答案 2 :(得分:1)
除了其他答案之外,您的问题还有一些变异,而Scheme中的列表通常是不可变的 - 甚至是列表中的列表。这就是为什么所有其他答案返回一个新列表没有你想要摆脱的元素。您可以为变量分配列表,然后使用set为同一变量分配不同的列表!但你永远不会改变你最初制作的清单。
答案 3 :(得分:0)
(cdr x)
(其中'x'是列表)将为您提供除第一个元素之外的所有列表。将其应用于上述内容的问题是apple
不是'((apple bob car) (cat dig) (e)))
的第一个元素。您给出的是列表列表,外部列表的第一个元素是列表(apple bob car)
。
要仅删除“apple”,您需要弄清楚您收到的列表中的第一项本身是否为列表,如果是这样,则将包含该列表的列表与第一项删除(提示:递归) ,然后是原始列表的其余部分。如果第一个项目不是列表,那么您只需返回列表的其余部分。