如何使用'cons'而不在Scheme中生成嵌套列表?

时间:2010-11-05 19:28:06

标签: list scheme append

在尝试生成两组中存在的子集列表时,我遇到了缺点的问题。程序会获取名为结果的列表,并尝试从结果和另一组 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)

1 个答案:

答案 0 :(得分:3)

首先,(((() . 1) . 2) . 3)不是嵌套列表 - 它根本不是列表。 (((() 1) 2) 3)将是嵌套列表。 (((() . 1) . 2) . 3)是一个虚线对,其第一个元素也是点对。

现在解释您看到的行为:在lisp系列语言(cons a b)中创建一对包含a的对,因为它是carb作为其{{1} }}

现在,列表可以是空列表(cdr),也可以是()也是列表的对(cdr可能包含任何内容 - 如果两者都car并且cdr是一个列表,该列表称为嵌套列表。

不是列表的对称为点对。这就是你在这里创建的,因为你用第二个参数调用car而不是列表。

结论:

您无法使用cons附加到列表的末尾。如果您需要附加到列表的末尾,则可以使用cons将单个元素列表作为第二个参数。

但请注意,附加到列表末尾的是concat操作,而在前面附加(使用O(n))是cons操作,因此如果可能,您应该更改你的算法,所以它只需要附加在前面。