Code Review
Compare your solutions
#|
Упражнение 3.17
Напишите правильную версию процедуры count-pairs из упражнения 3.16 которая возвращает число различных
пар в любой структуре. (Подсказка: просматривайте структуру, поддерживая при этом вспомогательную
структуру, следящую за тем, какие пары уже были посчитаны.)
|#
(#%require rackunit)
(define (count-pairs x)
(let ((passed-cons '()))
(define (rec x)
(if (not (pair? x))
0
(if (memq x passed-cons)
0
(begin
(set! passed-cons (cons x passed-cons))
(+ (rec (car x))
(rec (cdr x))
1)))))
(rec x)))
(define x (cons 'a 'b))
(define y (cons 'c 'd))
(define C3 (cons x y))
(define z (cons 'c x))
(define C4 (cons z x))
(define w (cons x x))
(define C7 (cons w w))
(define inf (cons 'c x))
(define Cinf (cons x inf))
(set-cdr! inf Cinf)
(check-equal? (count-pairs '()) 0)
(check-equal? (count-pairs '(a . b)) 1)
(check-equal? (count-pairs C3) 3)
(check-equal? (count-pairs C4) 3)
(check-equal? (count-pairs C7) 3)
(check-equal? (count-pairs Cinf) 3)