Code Review

Compare your solutions

    #|
  Упражнение 3.16

  Бен Битобор решил написать процедуру для подсчета числа пар в любой списковой структуре. «Это легко,
  — думает он. — Число пар в любой структуре есть число пар в car плюс число пар в cdr плюс один на
  текущую пару». И он пишет следующую процедуру:

    (define (count-pairs x)
      (if (not (pair? x))
          0
          (+ (count-pairs (car x))
             (count-pairs (cdr x))
             1)))

  Покажите, что эта процедура ошибочна. В частности, нарисуйте диаграммы, представляющие списковые
  структуры ровно из трех пар, для которых Бенова процедура вернет 3; вернет 4; вернет 7; вообще никогда
  не завершится.
|#

(#%require rackunit)

(define (count-pairs x)
  (if (not (pair? x))
      0
      (+ (count-pairs (car x))
         (count-pairs (cdr x))
         1)))

(define x (cons 'a 'b))
(define y (cons 'c 'd))
(define C3 (cons x y))

(check-equal? (count-pairs C3) 3)

(define z (cons 'c x))
(define C4 (cons z x))

(check-equal? (count-pairs C4) 4)

(define w (cons x x))
(define C7 (cons w w))

(check-equal? (count-pairs C7) 7)

(define inf (cons 'c x))
(define Cinf (cons x inf))
(set-cdr! inf Cinf)

;(count-pairs Cinf)

#|
          ┏━━━┳━━━┓   ┏━━━┳━━━┓
    C3 ──►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛
            │           └────────────────┐
            ▼                            ▼
          ┏━━━┳━━━┓   ┏━━━┳━━━┓        ┏━━━┳━━━┓   ┏━━━┳━━━┓
    x ───►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃  y ───►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛        ┗━┿━┻━━━┛   ┗━┿━┻━━━┛
            ▼           ▼                ▼           ▼
          ┏━━━┓       ┏━━━┓            ┏━━━┓       ┏━━━┓
          ┃ a ┃       ┃ b ┃            ┃ c ┃       ┃ d ┃
          ┗━━━┛       ┗━━━┛            ┗━━━┛       ┗━━━┛

          ┏━━━┳━━━┓   ┏━━━┳━━━┓
    C4 ──►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛
            │           └────────────────┐
            ▼                            ▼
          ┏━━━┳━━━┓   ┏━━━┳━━━┓        ┏━━━┳━━━┓   ┏━━━┳━━━┓
    z ───►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃  x ───►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛      ┌►┗━┿━┻━━━┛   ┗━┿━┻━━━┛
            ▼           └────────────┘   ▼           ▼
          ┏━━━┓                        ┏━━━┓       ┏━━━┓
          ┃ c ┃                        ┃ a ┃       ┃ b ┃
          ┗━━━┛                        ┗━━━┛       ┗━━━┛

          ┏━━━┳━━━┓   ┏━━━┳━━━┓
    C7 ──►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛
            │ ┌─────────┘
            ▼ ▼
          ┏━━━┳━━━┓   ┏━━━┳━━━┓
    w ───►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛
            │ ┌─────────┘
            ▼ ▼
          ┏━━━┳━━━┓   ┏━━━┳━━━┓
    x ───►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛
            ▼           ▼
          ┏━━━┓       ┏━━━┓
          ┃ a ┃       ┃ b ┃
          ┗━━━┛       ┗━━━┛

            ┌────────────────────────────────────────┐
            ▼                                        │
          ┏━━━┳━━━┓   ┏━━━┳━━━┓                      │
    Cinf─►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃                      │
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛                      │
            │           └────────────────┐           │
            ▼                            ▼           │
          ┏━━━┳━━━┓   ┏━━━┳━━━┓        ┏━━━┳━━━┓   ┏━┿━┳━━━┓
    x ───►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃  inf ─►┃ • ┃ • ╂──►┃ • ┃ ╱ ┃
          ┗━┿━┻━━━┛   ┗━┿━┻━━━┛        ┗━┿━┻━━━┛   ┗━━━┻━━━┛
            ▼           ▼                ▼
          ┏━━━┓       ┏━━━┓            ┏━━━┓
          ┃ a ┃       ┃ b ┃            ┃ c ┃
          ┗━━━┛       ┗━━━┛            ┗━━━┛
|#