2009/04/09

[The Little Schemer]Numbers Games 2

WS0629

The Little Schemer」のNumbers Gamesで「加減乗除も再帰でやろう」みたいな章があるわけです。

加減乗除の部分を写経したりしました。

手続き名は一部変更しています。

まだ除算を書いていませんでしたが今回は書いてあります。

 

 

何度も出てきてますが・・・。

 

1を加算する手続き

(define add1
  (lambda (n)
    (+ n 1)))

 

1を減算する手続き

(define sub1
  (lambda (n)
    (- n 1)))

 

nにmを加算する手続き

(define plus
  (lambda (n m)
    (cond
     ((zero? m) n)
     (else (add1 (plus n (sub1 m)))))))

 

nからmを減算する手続き

(define minus
  (lambda  (n m)
    (cond
     ((zero? m) n)
     (else (sub1 (minus n (sub1 m)))))))

 

nにmを乗算する手続き

(define multiply
  (lambda (n m)
    (cond
     ((zero? m) 0)
     (else (plus n (multiply n (sub1 m)))))))

 

大なり「>」

(define bigger
  (lambda (n m)
    (cond
     ((zero? n) #f)
     ((zero? m) #t)
     (else (bigger (sub1 n) (sub1 m))))))

 

小なり「<」

(define smaller
  (lambda (n m)
    (cond
     ((zero? m) #f)
     ((zero? n) #t)
     (else (smaller (sub1 n) (sub1 m))))))

 

nをmで除算する

(define divide
  (lambda (n m)
    (cond
     ((bigger m n) 0)
     (else (add1 (divide (minus n m) m))))))

 

数値の等値性を検証する「=」

(define equals?
  (lambda (n m)
    (cond
     ((zero? m) (zero? n))
     ((zero? n) #f)
     (else (equals? (sub1 n) (sub1 m))))))

 

上記equals?の別解

(define equals?
  (lambda (n m)
    (cond
     ((smaller n m) #f)
     ((bigger n m) #f)
     (else #t))))

 

べき乗「^」

(define power
  (lambda (n m)
    (cond
     ((zero? m) 1)
     (else (multiply n (power n (sub1 m)))))))

 

 

The Little Schemer
The Little Schemer
posted with amazlet at 09.03.30
Daniel P. Friedman Matthias Felleisen
Mit Pr
売り上げランキング: 16078
おすすめ度の平均: 5.0
5 小さなScheme処理系で学ぶ数学基礎理論
5 Schemeが好きになります
5 英語であるのが苦痛にならない楽しさ
5 面白いスタイル

 

The Seasoned Schemer
The Seasoned Schemer
posted with amazlet at 09.03.30
Daniel P. Friedman Matthias Felleisen
Mit Pr
売り上げランキング: 18883
おすすめ度の平均: 5.0
5 Little Schemer とセットで

0 件のコメント:

コメントを投稿