SICP問題2.60

  • 順序づけられない重複ありのリストを操作する手続き

element-of-set?は変更なし

(define (element-of-set? x set)
  (cond ((null? set) #f)
    ((equal? x (car set)) #t)
    (else (element-of-set? x (cdr set)))))

adjoin-set も変更なし

(define (adjoin-set x set)
  (if (element-of-set? x set)
      set
      (cons x set)))

intersection-set

(define (intersection-set set1 set2)
  (cond ((or (null? set1) (null? set2)) '())
    ((element-of-set? (car set1) set2)
     (cons (car set1)
           (intersection-set (cdr set1) set2)))
    (else (intersection-set (cdr set1) set2))))

union-set

(define (union-set set1 set2)
  (cond ((null? set1) set2)
    ((null? set2) set1)
    ((element-of-set? (car set1) set2)
     (union-set (cdr set1) set2))
    (else (cons (car set1)
            (union-set (cdr set1) set2)))))

intersection-set, union-setに関してはset1に重複が存在するか、set2に重複が存在するかで結果が変わって来る気がするけど、どうするのが正しいのかなぁ?

  • 重複なしの表現の対応する手続きと比べての効率はどうか?重複なし表現よりこの表現の方が使いたくなる応用はあるか?

重複ありの表現の方が効率は悪い。(メモリーも多く取るし、演算も時間がかかる)
重複有りの表現を使いたい場合は、リストの要素として何をしたのかを全て記録するようなアプリケーションの場合かなぁ。もっと良い方法はありそうな気がしますが。