这道题和3.17类似,采用一个临时变量把已经存在的元素放进去,然后查看cdr在不在集合中,如果在集合中,就是个环形结构,如果遍历完整个序列,所有的元素都不重复,则序列不是环。
#lang R5RS
(define (last-pair x)
(if (null? (cdr x))
x
(last-pair (cdr x))))
(define (make-cycle x)
(set-cdr! (last-pair x) x)
x)
(define (element-of-set? x set)
(cond ((null? set) #false)
((eq? x (car set)) #true)
(else (element-of-set? x (cdr set)))))
(define (adjoin-set x set)
(cons x set))
(define (is-cycle? x)
(let ((emp '()))
(define (is-cycle-item? x)
(cond ((not (pair? x)) #false)
((element-of-set? x emp) #true)
(else
(set! emp (adjoin-set x emp))
(is-cycle-item? (cdr x)))))
(is-cycle-item? x)))
(define z (make-cycle (list 'a 'b 'c)))
(display z)
(newline)
(display (is-cycle? z))
(newline)
(define z1 (list 'a 'b 'c))
(display z1)
(newline)
(display (is-cycle? z1))
运行结果
#0=(a b c . #0#)
#t
(a b c)
#f