この章では、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)
。