1

我想编写自己的附加,用于将元素附加到现有列表。

我写了以下内容:

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

3 回答 3

5

想想你希望你的基本情况是什么。你想要一个elem,还是想要一个包含单个项目的列表elem?它们是有区别的。如果想要后者,您将需要在代码中修复您的基本情况。

换句话说,你想(appendElem '() 42)返回42,还是(42)?仔细想想这个问题的答案,然后想想每个选择的后果是什么。

顺便说一句,虽然您可以实现appendElem为玩具,但您很快就会意识到该函数的运行时间为 O(n)。所以不要使用这种方法建立列表!构建列表的标准方法是将cons项目添加到列表中,然后reverse是最终结果列表。

于 2013-02-19T05:39:44.200 回答
1

这是答案:

(define (appendElem llist elem)
    (if (null? llist)
        (list elem)
        (cons (car llist) (appendElem (cdr llist) elem))))

感谢@Chris Jester-Young。

于 2013-02-19T05:55:59.870 回答
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)时间)。

于 2013-02-19T19:02:29.673 回答