SICP Exercise 3.18
Question
Write a procedure that examines a list and determines whether it contains a
cycle, that is, whether a program that tried to find the end of the list by
taking successive cdrs would go into an infinite loop. Exercise 3.13 constructed
such lists.
Answer
This will probably work almost always, but if, for some reason, you have the
string 'CYCLE_MARKER in your list, this would always return true.
(define (is-cycle? x)
(cond ((not (pair? x)) #f)
((eq? 'CYCLE_MARKER (car x)) #t)
(else (begin (set-car! x 'CYCLE_MARKER)
(is-cycle? (cdr x))))))
Testing it with one cycle and one regular list:
(define x (make-cycle (list 'a 'b 'c 'd)))
(define y (list 'a 'b 'c 'd))
(is-cycle? x)
(is-cycle? y)
Results:
#t
#f