List 如何从列表中删除第一个元素?
在Scheme中,如何从列表中删除第一个元素 假设我有下面的清单List 如何从列表中删除第一个元素?,list,scheme,List,Scheme,在Scheme中,如何从列表中删除第一个元素 假设我有下面的清单 '((apple bob car) (cat dig) (e))) 我怎样才能摆脱苹果而不去管其他的呢?Scheme中的三个基本列表操作是 cdr,意思是“休息”或“给我列表,不带第一项” car,意思是“第一个”或“给我列表中的第一项” cons,表示附加列表 假设s是列表((apple-bob-car)(cat-dig)(e)) 中间步骤 (car s) ; (apple bob car) (cdr (car
'((apple bob car) (cat dig) (e)))
我怎样才能摆脱苹果而不去管其他的呢?Scheme中的三个基本列表操作是
,意思是“休息”或“给我列表,不带第一项”cdr
,意思是“第一个”或“给我列表中的第一项”car
,表示附加列表cons
(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))
首先,认识到你的问题有点前后矛盾。如果要删除列表中的第一个元素,则只剩下
((cat dig) (e))
因为列表中的第一个元素是(apple bob car)
如果你只是想摆脱苹果,那么如果列表的头(车)本身就是一个列表,你就想用它的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))
(cdr x)
(其中“x”是一个列表)将提供除第一个元素之外的所有列表。将它应用于上面的内容的问题是,apple
不是:((apple-bob-car)(cat-dig)(e))的第一个元素。您给出的是一个列表列表,外部列表的第一个元素是列表(apple bob car)
要仅删除“苹果”,您需要确定您收到的列表中的第一个项目本身是否为列表,如果是,则将该列表与删除的第一个项目(提示:递归)组成一个列表,然后是原始列表的其余部分。如果第一项不是列表,那么您只需返回列表的其余部分。除了其他答案之外,您的问题还有一种变异的味道,Scheme中的列表通常是不可变的——即使是列表中的列表。这就是为什么所有其他答案都返回了一个新的列表,其中没有您想要删除的元素。您可以将列表分配给变量,然后使用set将不同的列表分配给同一变量!但你永远不会改变你第一次列的清单