これは、別のリストを作成しながらリストを再帰的にトラバースする方法の最も単純な例の 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
) を持つ入力リストのコピーですが、新しいコンスセル内に存在します。