理系学生日記

おまえはいつまで学生気分なのか

問題3-19 (3.3.1 Mutable List Structure)

問題3-18の問題を,空間計算量が定数に収まるようにして解く.
考えとしては,リストの各要素をつなぐポインタが,それよりも出現順序の早い要素を指していないかを逐一判定する感じにしてる.
時間計算量は増えちゃうけど,その辺はトレードオフかなって思ってます.
ホントはもっと良い方法とかあったりするんだろうけど,ぼくには考える力がマジに育ってませんから,これでとりあえず.

(define (has-cycle? l)
  (define (have-same? l search-idx current-idx current-val)
    (cond ((> search-idx current-idx) #f)
	  ((not (pair? l)) #f)
	  ((eq? l current-val) #t)
	  (else
	   (have-same? (cdr l) (+ search-idx 1) current-idx current-val))))
  (define (sub-has-cycle? current-idx current-list)
    (cond ((have-same? l 0 current-idx current-list) #t)
	  ((null? current-list) #f)
	  (else
	   (sub-has-cycle? (+ current-idx 1) (cdr current-list)))))
  (sub-has-cycle? 0 (cdr l)))