计算机程序的构造和解释 练习题3.18

这道题和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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值