2008/12/28

【scheme】コラッツcollatz角谷

「schemeでもコラッツの問題を書いてみよう!」と思ったら、こないだ書いててワロタ。 消しゴム系ですね、頭ん中。
【Scheme】SchemeでもCollatz http://ameblo.jp/valvallow/entry-10179274699.html
これがこないだの。
(define (collatz n)
  (display n)
  (newline)
  (if (> n 1)
      (if (even? n)
          (collatz (/ n 2))
          (collatz (+ (* n 3) 1)))))

(collatz 5)
;; =>  5
;; =>  16
;; =>  8
;; =>  4
;; =>  2
=> 1
(collatz 30)
;; =>  30
;; =>  15
;; =>  46
;; =>  23
;; =>  70
;; =>  35
;; =>  106
;; =>  53
;; =>  160
;; =>  80
;; =>  40
;; =>  20
;; =>  10
;; =>  5
;; =>  16
;; =>  8
;; =>  4
;; =>  2
;; =>  1

これが今日書いたの。 こないだより悪くなってるような気がするな。
;;collatz
(define collatz
  (lambda (seed f)
    (f seed)
    (cond
     ((<= seed 1))
     ((even? seed)
      (collatz (/ seed 2) f))
     ((odd? seed)
      (collatz (+ 1 (* seed 3)) f)))))

(collatz 5 (lambda (s)(display s)(newline))) ;;=> 5 ;;=> 16 ;;=> 8 ;;=> 4 ;;=> 2 ;;=> 1 ;;=> #t

Y-Combinatorで。
 【Scheme】Y-Combinator(Yコンビネータ/不動点演算子) http://ameblo.jp/valvallow/entry-10182574504.html
;;collatz with y-combinator

;;Y is y-combinator
(define Y
  (lambda (f)
    ((lambda (h)(h h))
     (lambda (p)
       (f (lambda (n)((p p) n)))))))

;;collatz
(define collatz
  (lambda (f)
    (lambda (seed)
      (display seed)
      (newline)
      (cond
       ((<= seed 1))
       ((even? seed)
        (f (/ seed 2)))
       ((odd? seed)
        (f (+ 1 (* seed 3))))))))

((Y collatz) 5)
;;=> 5
;;=> 16
;;=> 8
;;=> 4
;;=> 2
;;=> 1
;;=> #t
Y-Combinator、複数パラメータに対応したの書いてみたい。 ここが参考になりそう。
ボクノス:Yコンビネータを読み解こう http://d.hatena.ne.jp/tanakaBox/20080203/1202023473

プログラミングGauche

0 件のコメント:

コメントを投稿