2009/01/01

【Scheme】問題1.9@SICP

あけましておめでとうございます。

インクリメント関数、デクリメント関数

(define inc
  (lambda (x) (+ x 1)))
(define dec
  (lambda (x) (- x 1)))
こっちの方がしっくりくるけど取りあえず置いといて。
(define ++ inc)
(define -- dec)

(++ 1);;=> 2
(-- 1);;=> 0
SICPでは+関数として定義してあるけど、ちょっと判りづらいので「plus」にした。
(define plus
  (lambda (a b)
    (if (zero? a)
      b
      (inc (plus (dec a) b)))))
実行結果(式展開)。再帰的。
;;recursive
(plus 4 5)
(inc (plus (dec 4) 5))
(inc (inc (plus (dec 3) 5)))
(inc (inc (inc (plus (dec 2) 5))))
(inc (inc (inc (inc (plus (dec 1) 5)))))
(inc (inc (inc (inc (plus 0 5))))
(inc (inc (inc (inc 5)))
(inc (inc (inc 6)))
(inc (inc 7))
(inc 8)
9
同じく+からplus2に変更。
(define plus2
  (lambda (a b)
    (if (zero? a)
      b
      (plus2 (dec a)(inc b)))))
実行結果。反復的。
;;iterative
(plus2 4 5)
(plus2 (dec 4)(inc 5))
(plus2 (dec 3)(inc 6))
(plus2 (dec 2)(inc 7))
(plus2 (dec 1)(inc 8))
9

0 件のコメント:

コメントを投稿