1

既存の list に要素を追加するために、独自の append を書きたいと思います。

私は次のように書いています:

(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

基本ケースをどうしたいかを考えてください。のみが必要ですか、それとも1 つのアイテムを含むリスト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 に答える