Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
##(link2sicp "book-Z-H-22.html#%_thm_3.19" "Exercise 3.19")
解答例
対象となるリストに対して、cdr及びcddrを繰り返し、 その都度eq?で両者を比較する。循環している場合、cddrが cdrに追いつき、循環していると判定される。
(define (loop-check x)
(define (check x0 x1)
(cond ((eq? x0 x1) true)
((null? (cdr x1)) false)
((null? (cddr x1)) false)
(else (check (cdr x0) (cddr x1)))))
(if (and (pair? x) (pair? (cdr x)))
(check (cdr x) (cddr x))
false))
実行例
gosh> (loop-check '(a b c)) #f gosh> (define z (make-cycle (list 'a 'b 'c))) z gosh> (loop-check z) #t
問題18同様、carで循環しているようなリストに対しては loop-checkで循環を判別できない。
gosh> (define c (list 'foo)) c gosh> (define ll (cons 'foo (cons 'foo c))) ll gosh> (set-car! c ll) #<undef> gosh> (loop-check c) #f gosh> c #0=((foo foo . #0#))
--hidenao
コード
##(sicp-answer-code "ex-3.19.scm")