我想编写自己的附加内容,以便将元素附加到现有列表中。
我写了以下内容:
(define (appendElem llist elem)
(if (null? llist)
elem
(cons (car llist) (appendElem (cdr llist) elem))))
但是当我这样做时:
(appendElem (list 1 2 30) 11)
我明白了:
(1 2 30 . 11)
问题是,为什么(1 2 30 . 11)
而不是(1 2 30 11)
?
谢谢
编辑:
修正:
(define (appendElem llist elem)
(if (null? llist)
(list elem)
(cons (car llist) (appendElem (cdr llist) elem))))
答案 0 :(得分:5)
想想你的基本情况是什么。您只想elem
,还是想要单个项目elem
的列表?它们是有区别的。如果想要后者,则需要在代码中修复基本情况。
换句话说,您希望(appendElem '() 42)
返回42
还是(42)
?仔细考虑这个问题的答案,然后考虑每个选择的结果是什么。
顺便说一句,虽然您可以将appendElem
实现为玩具,但您很快就会意识到该函数具有O(n)运行时。所以不要使用这种方法构建列表!构建列表的标准方法是向cons
个项目,然后reverse
最终结果列表。
答案 1 :(得分:1)
以下是答案:
(define (appendElem llist elem)
(if (null? llist)
(list elem)
(cons (car llist) (appendElem (cdr llist) elem))))
感谢@Chris Jester-Young。
答案 2 :(得分:0)
另一个建议:
(define (make-dl ls) ; turn a list into a difference list
(cons ls (last-pair ls)))
(define (snoc-dl! dl e) ; snoc ~ appendElem, destructively
(set-cdr! (cdr dl) (list e))
(set-cdr! dl (cddr dl)))
(define (dl-list dl) ; get the list back
(car dl))
对于列表末尾附加的O(1)
(好的,调用make-dl
将为O(n)
,但所有后续附加将花费O(1)
时间。