計算機プログラムの構造と解釈 第二版 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)
ちょっと頭がかゆい。