LoginSignup
2
0

More than 5 years have passed since last update.

Scheme手習いメモ (4章 - 数遊び)

Posted at

この章では、Schemeにおける数値を用いた再帰について学ぶ。

add1, sub1

いわゆるインクリメントとデクリメントをする関数定義する。

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

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

(print (add1 10))
(print (sub1 10))

数値はアトム。整数も小数も数値でありアトムである。でも3章では0以上の整数のみ扱う。

o+, o-

上記の add1, sub1 を用いて整数同士の加算と乗算を定義する。

o-.scm
(define o-
  (lambda (n m)
    (cond
      ((zero? m) n)
      (else (sub1 (o- n (sub1 m)))))))

(print (o+ 4 3))
(print (o- 4 3))

出力は 7 1

addtup

数値のリストをタップという。空のタップ () を空タップという。タップに含まれるすべての数値を加算した結果を返す関数 addtup を定義する。

addtup.scm
(define addtup
  (lambda (tup)
    (cond
      ((null? tup) 0)
      (else (o+ (car tup) (addtup (cdr tup)))))))

(print (addtup '(10 20 40)))

x

自然な乗算を定義する。

x.scm
(define x
  (lambda (n m)
    (cond
      ((zero? m) 0)
      (else (o+ n (x n (sub1 m)))))))

(print (x 10 20))

tup+

ふたつのタップ tup1, tup2 を引数にとり、それぞれのタップのn番目の要素同士を加算した新しいタップを返す関数 tup+ を定義する。

tup+.scm
(define tup+
  (lambda (tup1 tup2)
    (cond 
      ((null? tup1) tup2)
      ((null? tup2) tup1)
      (else
        (cons (o+ (car tup1) (car tup2))
              (tup+
                (cdr tup1) (cdr tup2)))))))


(define tup1 '(3 7))
(define tup2 '(4 6 8 1))
(print (tup+ tup1 tup2))

出力は (7 13 8 1)

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0