我如何在不创建虚线对的情况下附加到列表



我如何将 (1 2 3)附加到 ()的末端以制造 ((1 2 3))
我如何将 (4 5 6)附加到的末尾制作 ((1 2 3) (4 5 6))
我如何将 "|"附加到的末尾使((1 2 3) (4 5 6) "|")

没有虚线对。

我正在使用鸡肉计划,但此时我会从任何计划中得到答案。请注意,这些列表中的任何一个也可以是谁知道什么的嵌套列表...我只是在写一个琐碎的例子。

注意:@sjamaan使用附录显示 a 解决方案,其中涉及将其他所有列表包装在其他列表中,以补偿除名称所说的内容以外的其他事情。

(append (list 1 2 3) "|" ) ;=> (1 2 3 . "|") ;^^ didn't actually append, created a dotted pair (append '(1 2 3) (list 4 5 6)) ;=> (1 2 3 4 5 6) ; don't want unwrapped list ;^^ didn't actually append the list i gave it but appended the contents of the list.

基本上,我希望一种附加方法实际上附加了您提供的东西,而不是附加内容,或者拿走它并制作了一对。也许我只是一个梦想家...我可以写出一种"不真正附加"的方法,它只能采用您给它的任何参数,并将它们包裹在外部清单中以补偿,但这只是愚蠢的...

附加没有这种疯狂。

这是对附录进行的方式:

(define (append2 lst1 lst2)
  (if (null? lst1)
      lst2                               ; the second list is unaltered
      (cons (car lst1)
            (append2 (cdr lst1) lst2))))

使配对链由lst1lst2中的所有元素组成。它不会在lst2中不存在的地方制成一对:

(append2 '(1 2 3) '(4 5)) ; ==> (1 2 3 4 5)
(append2 '(1 2 3) '())    ; ==> (1 2 3) and not (1 2 3 ())
(append2 '(1 2 3) '5)     ; ==> (1 2 3 . 5)

请注意,诸如(1 2 3)之类的每个列表实际上是(1 2 3 . ()),甚至更正确地 (1 . (2 . (3 . ())))

如何将(1 2 3)附加到()的末端以制造((1 2 3))

(define (insert-last e lst)
  (let helper ((lst lst))
    (if (pair? lst)
        (cons (car lst)
              (helper (cdr lst)))
        (cons e '()))))
(insert-last '(1 2 3) '())                    
; ==> ((1 2 3))

如何将(4 5 6)附加到的末尾使((1 2 3) (4 5 6))

(insert-last '(4 5 6) '((1 2 3)))  
; ==> ((1 2 3) (4 5 6))

我如何将 "|"附加到的末尾制作 ((1 2 3) (4 5 6) "|")

(insert-last "|" '((1 2 3) (4 5 6)))  
; ==> ((1 2 3) (4 5 6) "|")

知道这很像append。这些是最糟糕的方法,因为您每次都在列出新列表。对于每个元素,每个插入物是o(n(,o(n^2(。如果您可以以相反的顺序执行此操作,则可以将每个插入物都可以执行此操作O(1(而不是O(n(。而不是insert-last您使用cons

(cons '"|" '())               ; ==> ("|")
(cons '(4 5 6) '("|"))        ; ==> ((4 5 6) "|")
(cons '(1 2 3) '((4 5 6) "|") ; ==> ((1 2 3) (4 5 6) "|")

对于处理的n个元素,这是O(1(,O(n(。如果您需要按原始顺序进行累积,请进行反向。

(cons '(1 2 3) '())                ; ==> ((1 2 3))
(cons '(4 5 6) '((1 2 3)))         ; ==> ((4 5 6) (1 2 3))
(cons '"|" '((4 5 6) (1 2 3)))   ; ==> ("|" (4 5 6) (1 2 3))
(reverse '("|" (4 5 6) (1 2 3))  ; ==> ((1 2 3) (4 5 6) "|")

这是o(1(,然后是反向的o(n(,但仍然是o(1(摊销。o(n(对于您处理的n元素。

append不会将原子附加到列表中。它连接列表。在串联之前,您必须将原子提升到列表。

(append xs (list y))

但是指出具有相同结果的(reverse (cons y (reverse xs)))是有意义的。reverse建议,如果您需要将原子附加到最后。

您要寻找的过程毫不奇怪地称为"附加"(来自SRFI-1(。它将事物列表附加到另一个列表中。这确实意味着,如果您只想添加一个项目,则需要从中列出一个列表:

(append '() '((1 2 3))) => ((1 2 3))
(append '((1 2 3)) '((4 5 6))) => ((1 2 3) (4 5 6))
(append '((1 2 3) (4 5 6)) '("|") ) => ((1 2 3) (4 5 6) "|")

它接受多个参数,这些参数将以该顺序互相附加到彼此,因此您也可以做:

(append '() '((1 2 3)) '((4 5 6)) '("|")) => ((1 2 3) (4 5 6) "|")

希望这会有所帮助!

无论您是否愿意,都会创建缺点,因为列表由Cons Cells组成。

如何将(1 2 3(附加到((的末尾((1 2 3((

CL-USER 24 > (list '(1 2 3))
((1 2 3))

我如何将(4 5 6(添加到结尾((1 2 3((4 5 6((

CL-USER 25 > (append '((1 2 3)) (list '(4 5 6)))
((1 2 3) (4 5 6))

我如何附加" |"到底要制作((1 2 3((4 5 6(" |"(

CL-USER 26 > (append '((1 2 3) (4 5 6)) (list "|"))
((1 2 3) (4 5 6) "|")

相关内容

  • 没有找到相关文章

最新更新