単方向リストの問題
>
>http://d.hatena.ne.jp/lethevert/20070108/p1
>について scheme で解いた。→
>http://www.lingr.com/room/gauche/archives/2007/01/08#msg-709706
>
議論を追っていけばわかるけど、最初のやつは間違えている。 > >ちなみになんで scheme かというと、 C で書くのは面倒だったから。一方で Haskell では、ノードの物理的な一致関係を計算するのがけっこう面倒なのです。 > >(use srfi-1)
議論を追っていけばわかるけど、最初のやつは間違えている。 > >ちなみになんで scheme かというと、 C で書くのは面倒だったから。一方で Haskell では、ノードの物理的な一致関係を計算するのがけっこう面倒なのです。 > >(use srfi-1)
(define (chased-cell l)
(let loop ((h (cddr l)) (t (cdr l)))
(if (eq? h t) h (loop (cddr h) (cdr t)))))
(define (ring-size r)
(let loop ((c (cdr r)) (n 1))
(if (eq? c r) n (loop (cdr c) (+ n 1)))))
(define (circular-length l)
(define (loop l1 l2 s)
(if (eq? l1 l2) s (loop (cdr l1) (cdr l2) (+ s 1))))
(let* ((c (chased-cell l)) (rs (ring-size c)))
(loop l (drop l rs) rs))
(define (same-circular? l1 l2)
(define (check c1 c2)
(let loop ((c3 (cdr c1)))
(cond ((eq? c2 c3) #t)
((eq? c1 c3) #f)
(else (loop (cdr c3))))))
(check (l1c (chased-cell l1)) (l2c (chased-cell l2))))
>