添加一个临时变量emp,判断临时变量里面有没有目前判断的序对,没有的话就把这个序对添加进emp,有的话就直接算0个。
当然最后可以查看emp的长度来判断有多少个序对。
#lang R5RS
;;判断集合中是否有该元素,注意一定要用eq?
(define (element-of-set? x set)
(cond ((null? set) #false)
((eq? x (car set)) #true)
(else (element-of-set? x (cdr set)))))
;;将一个元素添加进集合
(define (adjoin-set x set)
(cons x set))
(define (count-pairs x)
(let ((emp '()))
(define (count-pairs-item x)
(cond ((not (pair? x)) 0)
((element-of-set? x emp) 0)
(else
(set! emp (adjoin-set x emp))
(+ (count-pairs-item (car x))
(count-pairs-item (cdr x))
1))))
(count-pairs-item x)))
(define z1 (list 'a 'b 'c))
(define x (cons 'b 'c))
(define z2 (cons 'a (cons x x)))
(define y (cons x x))
(define z3 (cons y y))
(define z4 (list 'a 'b 'c))
(set-cdr! (cddr z4) z4)
(display (count-pairs z1))
(newline)
(display (count-pairs z2))
(newline)
(display (count-pairs z3))
(newline)
(display (count-pairs z4))
(newline)
运行结果
3
3
3
3