SICP問題3.18

循環が含まれるかを決める手続き

(define (endless-loop-list? l)
  (define cl '()) ; checked-list
  (define (sub-rcsv x)
    (cond ((not (pair? x)) #f)
          ((memq x cl) #t)
          (else
           (set! cl (cons x cl))
           (sub-rcsv (cdr x)))))
  (sub-rcsv l))

テスト
3.13のmake-cycleを使って無限ループするリストを作成してテストする

(define z (make-cycle (list 'a 'b 'c)))
; z
(define l3 (list 'a 'b 'c))
; l3
(define x (cons 'a '()))
; x
(define y (cons 'b x))
; y
(define l4 (cons y x))
; l4
(define x (cons 'a '()))
; x
(define y (cons x x))
; y
(define l7 (cons y y))
; l7
(endless-loop-list? z)
; #t
(endless-loop-list? l3)
; #f
(endless-loop-list? l4)
; #f
(endless-loop-list? l7)
; #f
(endless-loop-list? '())
; #f
(endless-loop-list? (cons 'a '()))
; #f
(endless-loop-list? (cons 'a 'b))
; #f

OK