我如何将 (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))))
使配对链由lst1
和lst2
中的所有元素组成。它不会在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) "|")