在尝试生成两组中存在的子集列表时,我遇到了缺点的问题。程序会获取名为结果的列表,并尝试从结果和另一组 car 构建新列表。到目前为止,使用正确的元素生成集合,但它们包含在 N 大小的嵌套列表中,其中N是嵌套的数量以及我要搜索的子集中的元素数量。
如何在不创建嵌套列表的情况下将缺点应用于结果?
示例:
;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)
我需要能够拨打 (car list)
并接听1
而不是((() . 1) . 2)
答案 0 :(得分:3)
首先,(((() . 1) . 2) . 3)
不是嵌套列表 - 它根本不是列表。 (((() 1) 2) 3)
将是嵌套列表。 (((() . 1) . 2) . 3)
是一个虚线对,其第一个元素也是点对。
现在解释您看到的行为:在lisp系列语言(cons a b)
中创建一对包含a
的对,因为它是car
和b
作为其{{1} }}
现在,列表可以是空列表(cdr
),也可以是()
也是列表的对(cdr
可能包含任何内容 - 如果两者都car
并且cdr
是一个列表,该列表称为嵌套列表。
不是列表的对称为点对。这就是你在这里创建的,因为你用第二个参数调用car
而不是列表。
您无法使用cons
附加到列表的末尾。如果您需要附加到列表的末尾,则可以使用cons
将单个元素列表作为第二个参数。
但请注意,附加到列表末尾的是concat
操作,而在前面附加(使用O(n)
)是cons
操作,因此如果可能,您应该更改你的算法,所以它只需要附加在前面。