List 如何使用';反对意见';在Scheme中不生成嵌套列表?

List 如何使用';反对意见';在Scheme中不生成嵌套列表?,list,scheme,append,List,Scheme,Append,在试图生成两个集合中存在的子集列表时,我遇到了一个问题cons。一个过程接收一个名为result的列表,并尝试从另一个集合的result和car构建一个新列表。到目前为止,集合是使用正确的元素生成的,但它们包含在大小N嵌套列表中,其中N是嵌套的数量和我正在搜索的子集中的元素数量 在不创建嵌套列表的情况下,如何使用结果应用cons 例如: ;These are two sets that I will be checking (define s1 '(1 2 3 4)) (define s2 '(

在试图生成两个集合中存在的子集列表时,我遇到了一个问题cons。一个过程接收一个名为result的列表,并尝试从另一个集合的resultcar构建一个新列表。到目前为止,集合是使用正确的元素生成的,但它们包含在大小N嵌套列表中,其中N是嵌套的数量和我正在搜索的子集中的元素数量

在不创建嵌套列表的情况下,如何使用结果应用cons

例如:

;These are two sets that I will be checking
(define s1 '(1 2 3 4))
(define s2 '(1 2 3))
;Result from running these lists through my procedure
(((() . 1) . 2) . 3)
;What I want to have generated
(1 2 3)
我需要能够调用
(汽车列表)
并接收
1
而不是
(().1)。2
首先
((().1)。2。3)
不是嵌套列表-它根本不是列表<代码>((()1)2)3将是一个嵌套列表
((().1.2.3)
是一个点对,其第一个元素也是点对

现在来解释一下您看到的行为:在lisp语言家族
(cons a b)
中,创建一对包含
a
作为
car
b
作为其
cdr

现在,列表要么是空列表(
()
),要么是其
cdr
也是列表的一对(
car
可能包含任何内容-如果
cdr
car
都是列表,则该列表称为嵌套列表)

不是列表的一对称为点对。这是您在这里创建的,因为您正在使用第二个参数调用
cons
,该参数不是列表

结论: 您不能使用
cons
附加到列表的末尾。如果需要附加到列表的末尾,可以使用带有单个元素列表的
concat
作为第二个参数

但是请注意,在列表末尾追加是一个
O(n)
操作,而在前面追加(使用
cons
)是一个
O(1)
操作,因此如果可能,您应该更改算法,因此只需要在前面追加不是嵌套列表-它根本不是列表<代码>((()1)2)3将是一个嵌套列表
((().1.2.3)
是一个点对,其第一个元素也是点对

现在来解释一下您看到的行为:在lisp语言家族
(cons a b)
中,创建一对包含
a
作为
car
b
作为其
cdr

现在,列表要么是空列表(
()
),要么是其
cdr
也是列表的一对(
car
可能包含任何内容-如果
cdr
car
都是列表,则该列表称为嵌套列表)

不是列表的一对称为点对。这是您在这里创建的,因为您正在使用第二个参数调用
cons
,该参数不是列表

结论: 您不能使用
cons
附加到列表的末尾。如果需要附加到列表的末尾,可以使用带有单个元素列表的
concat
作为第二个参数


但是请注意,在列表末尾追加是一个
O(n)
操作,而在前面追加(使用
cons
)是一个
O(1)
操作,因此如果可能,您应该更改算法,因此它只需要在前面追加。

我错误地传递了一个点对作为cons的第一个参数。当我改变顺序如下时,一切正常;破坏方法(cons结果(车辆s2));正确工作(cons(汽车s2)结果)2个好规则:cons的第二个参数应该是一个列表,每个列表都以
'()
结尾,这意味着一个包含三个子列表的列表中有4个空列表。我错误地将虚线对作为cons的第一个参数传递。当我改变顺序如下时,一切正常;破坏方法(cons结果(车辆s2));正确工作(cons(car s2)结果)2个好规则:cons的第二个参数应该是一个列表,每个列表都以
'()
结尾,这意味着包含三个子列表的列表中有4个空列表。