1

oneシンボルのリストを消費して同じリストを返す関数をどのように開発します'catか?

たとえば

 (one (cons 'animal(cons 'table (cons 'cat (cons 'bread
    empty)))))

私は得るだろう(私は思う)

 (cons 'animal (cons 'table (cons 'cat (cons 'cat (cons 'bread 
    empty)))))

見返りに。私は本を​​読んでこれを理解しようとしてイライラしています。

4

2 に答える 2

3

これは、別のリストを作成しながらリストを再帰的にトラバースする方法の最も単純な例の 1 つです。あなたは学習過程にあるので、自分で書くべきです。ソリューションの一般的な構造について少しお手伝いします。空欄を埋めてください。

(define (copy lst)
  (if <???>                 ; is the list empty?
      <???>                 ; if so, return the empty list
      (cons <???>           ; otherwise `cons` the first element of the list (*)
            (copy <???>)))) ; and advance the recursion over the rest of the list

(*) ... ただし、要素が の場合は、その2 つのコピーを'catコンスします。

質問のリストでテストします。

(copy (cons 'one (cons 'animal (cons 'table (cons 'cat (cons 'bread empty))))))

...たまたまこれと同等です:

(copy '(one animal table cat bread))

いずれにせよ、結果は同じ要素 (および見つかったそれぞれの 2 つのコピー'cat) を持つ入力リストのコピーですが、新しいコンスセル内に存在します。

于 2013-02-08T19:40:27.947 に答える
2

Leppie (上記の私のset-car!/set-cdr!コメントに応えて、「トラフィックであなたのミューテーションを試してみてください ;p」と言われました ;-)) は、折り畳みベースのソリューションを書いてほしいと思ったので、ここにあります!

(define (fun lst)
  (fold-right (lambda (e r)
                (case e
                 ((cat) (cons* e e r))
                 (else (cons e r))))
              '() lst))
于 2013-02-08T20:14:20.167 に答える