計算機プログラムの構造と解釈 第二版 P89 問題2.59

そんなに難しい問題ではない。
基本的な考え方は、今までやってきたappendとかと大してかわらない。
重複がなければリストに付け加えていけば良いだけ。


実装

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

(use ggc.debug.trace)
(use math.mt-random)


(define nil '())

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

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


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


(define (union-set set1 set2)
  (cond ((and (null? set1) (null? set2)) nil)
        ((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)))))


(define set1 '(1 2 3 4 5)) 
(define set2 '(2 3 4 5 6 7)) 

;; main
(define (main args)

  (display "set1: ")
  (display set1)
  (newline)
  (display "set2: ")
  (display set2)
  (newline)

  (display "(union-set set1 set2): ")
  (display (union-set set1 set2))
  (newline)

  0)

実行

set1: (1 2 3 4 5)
set2: (2 3 4 5 6 7)
(union-set set1 set2): (1 2 3 4 5 6 7)


ちょっと頭がかゆい。