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

JAN*_*JAN 1 scheme functional-programming list append r5rs

我想编写自己的追加,用于将元素追加到现有列表中.

我写了以下内容:

(define (appendElem llist elem)
    (if (null? llist)
        elem
        (cons (car llist) (appendElem (cdr llist) elem))))
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时:

(appendElem (list 1 2 30) 11)
Run Code Online (Sandbox Code Playgroud)

我明白了:

(1 2 30 . 11)
Run Code Online (Sandbox Code Playgroud)

所以问题是,为什么(1 2 30 . 11)(1 2 30 11)呢?

谢谢

编辑:

修正:

(define (appendElem llist elem)
    (if (null? llist)
        (list elem)
        (cons (car llist) (appendElem (cdr llist) elem))))
Run Code Online (Sandbox Code Playgroud)

Chr*_*ung 5

想想你想要的基本情况.你想要的只是elem,或者你想要一个单项的列表elem?它们是有区别的.如果想要后者,则需要在代码中修复基本情况.

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

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