Code Review
Compare your solutions
#|
Упражнение 3.18
Напишите процедуру, которая рассматривает список и определяет, содержится ли в нем цикл, то есть, не
войдет ли программа, которая попытается добраться до конца списка, продвигаясь по полям cdr, в бесконечный
цикл. Такие списки порождались в упражнении 3.13.
|#
(#%require rackunit)
(define (cycle? L)
(define (rec lst passed-cons)
(if (null? lst)
#f
(if (memq lst passed-cons)
#t
(rec (cdr lst) (cons lst passed-cons)))))
(rec L '()))
(define lE '())
(define l0 '(1 2 3))
(define l1 (cons l0 l0))
(define l2 '(1 2 3))
(set-cdr! (cddr l2) l2)
(define l3 '(1 2 3))
(set-cdr! (cddr l3) (cdr l3))
(define l4 '(1 2 3 4))
(set-car! (cddr l4) (cdr l4))
(check-false (cycle? lE))
(check-false (cycle? l0))
(check-false (cycle? l1))
(check-false (cycle? l4))
(check-true (cycle? l2))
(check-true (cycle? l3))