方案 - 写我自己的追加产生了一个奇怪的结果

时间:2013-02-19 05:34:10

标签: list functional-programming append scheme r5rs

我想编写自己的附加内容,以便将元素附加到现有列表中。

我写了以下内容:

(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))))

3 个答案:

答案 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)时间。