List 如何使用';反对意见';在Scheme中不生成嵌套列表?
在试图生成两个集合中存在的子集列表时,我遇到了一个问题cons。一个过程接收一个名为result的列表,并尝试从另一个集合的result和car构建一个新列表。到目前为止,集合是使用正确的元素生成的,但它们包含在大小N嵌套列表中,其中N是嵌套的数量和我正在搜索的子集中的元素数量 在不创建嵌套列表的情况下,如何使用结果应用cons 例如: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 '(
;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个空列表。