sp
-16. cons
と種々のデータ構
造
1
金子邦彦
(
Scheme
プログラミング)
URL:
https://www
.kkaneko.jp/pro/scheme/index.html
ア
ウ
トライン
16
-
1
ペア
16
-
2
パソコン演習
16
-
3
課題
2
16
-
1
ペア
3
apple
100
car
cdr
ペアとは
:
2つの構成部分
のペアのこと.
car
と
cdr
に分かれる
単純なペアの
例
ペアとは
4
•
cons
は2
つの引数を取り,2つの引数を部分と
して含むよ
う
な「ペア」を返す
例)
(define x (cons 'apple 100))
•
ペアを構成する部分は,
car
,
cdr
で取
り出せる
例)
(car x)
→
「
apple
」が得られる
(cdr x)
→
「
100
」が得られる
•
ペアは,「対」ともい
う
car
と
cdr
5
100
apple
ペアとは
:
2つの構成部分
のペアのこと.
car
と
cdr
に分かれる
(cons 'apple
100)
の箱とポインタ記法
6
100
apple
car
cdr
(cons 'apple
100)
の箱とポインタ記法
7
apple
ペアは,上のよ
う
に,箱とポインタ表記され
る
(cons 'apple empty)
の箱とポインタ記法
8
apple
car
cdr
(cons 'apple empty)
の箱とポインタ記法
9
•
「リスト」は
末尾が「空リスト」であるよ
う
な
「ペアの並び」
である
•
ペアの組み合わせに
よって,複雑な構造を表現で
きる
まとめ
10
16
-
2
パソコン演習
11
•
資料を見な
がら,「
例題
」を
行ってみる
•
各自,「
課題
」に挑戦する
•
自分のペー
スで先に進んで構
いません
パソコン演習の進め方
12
•
DrScheme
の起動
プログラム
→ PL
T
Scheme → DrSchem
e
•
今日の演習では「
Full
Scheme
」
に設定
Language
→ Choose Language
→ Full Scheme
→ OK
→
「
Execute
ボタン」
DrScheme
の使用
13
•
ペアが,自由に扱えるよ
う
になる
•
但し,「
empty
」が使えなくなる
ので,代わりに「
'()
」を使
う
•
Full Scheme
で
empty
を使お
う
とす
るとエラー
•
リストの表示が変わる
(lis
t 15 8 6)
⇒
(15 8 6)
のよ
う
に
Full Scheme
では
14
•
シンボルと数値のペアを作る
•
ペアを生成
するために
cons
を使
う
•
ペアを構成する
部分
(
'app
le
や
100
など
)
を
取り出すために
car
,
cdr
を使
う
変数
x
:
シンボル
'apple
と数値
100
のペア
変数
y:
シンボル
'orange
と数値
60
のペア
変数
z:
シンボル
'banana
と数値
80
のペア
例題1.ペア
15
1.
次を「
定義用
ウ
インド
ウ
」で,実行し
なさい
•
入力した後に,
Ex
ecute
ボタンを押す
(define x
(con
s 'apple 100))
(define y (c
ons 'o
rang
e 60))
(define z (c
ons 'banana 80
))
2
.
その後,次を「
実行用
ウ
インド
ウ
」
で実行しなさい
☆
次は,例題2に進んでください
x
(car x)
(cdr x)
「例題1.ペア」の手順
16
ペアの生成
表示されたペ
ア
17
•
リスト
15, 8, 6
を変数として定義し,
名前
A
を付ける
•
変数を定義するために
de
fine
を使
う
•
リストを作るために
cons
を使
う
例題2.リストの変数定義
18
1.
次を「
定義用
ウ
インド
ウ
」で,実行し
なさい
•
入力した後に,
Ex
ecute
ボタンを押す
(define A (c
ons 15 (c
ons 8 (c
ons 6 '()))))
2
.
その後,次を「
実行用
ウ
インド
ウ
」で実
行しなさい
☆
次は,例題3に進んでください
A
(car A)
(cdr A)
「例題2.リストの変数定
義」の手順
19
「
'()
」は,
空リストの意味
20
15
8
6
•
リストの要素が,「ペアの並び」と
して順順につながる
(cons
15 (cons
8 (cons 6 '())))
の箱とポインタ記法
21
15
8
6
c
ar
cdr
(cons
15 (cons
8 (cons 6 '())))
の箱とポインタ記法
22
15
8
6
car
cdr
•
リストの
car:
•
リストの先頭要素
•
リストの
cdr:
•
リストから先頭要素を
取り除いた残り(
やはりリスト)
リストの
car
と
cdr
23
15
8
6
「空リストで
ある」こと
を示す特別な値が
入っている
リストの末尾としての空リスト
24
15
8
6
•
リストを構成する
ペアの個数
:リストの要素
数に
等しい
•
リストを構成するペアの
car
:
リストの要素が入
る
リストを構成するペアの性質
(1/2)
25
15
8
6
•
リストを構成するペアの
右側のセル
(cdr
フィールド
)
•
次の要素
へのポイン
タか,「空
リス
ト」である
ことを示す
特別な値
(リストの
末端である
こと
を示す)が
入る
リストを構成するペアの性質
(2/2)
26
•
Scheme
では
末尾が「空
リスト」であるよ
う
なペアの並び
•
並びの最後のペアの
cdr
フィールドに空リスト
が入っ
ている
•
行儀の良いリスト(
proper list
)と呼ぶこともある
リストとは
27
15
8
6
car
cdr
(cons 15 (cons
8 (cons 6 '())))
8
6
car
cdr
(cons 8 (cons 6
'()))
6
car
cdr
(
cdr
は空リスト)
(cons 6 '())
28
•
リストでは:
•
リストと要素をつなげて,新しいリスト
を作る
•
一般的には:
•
データとデータをつなげて,新しいペア
を作る
cons
の意味
29
•
下記のペアを,変数
a
として定義する
1
2
3
4
cdr
car
例題3.ペアから構成され
たペア
30
1.
次を「
定義用
ウ
インド
ウ
」で,実行し
なさい
•
入力した後に,
Ex
ecute
ボタンを押す
(de
fine a (c
ons (cons 1
2)
(cons 3 4)))
2
.
その後,次を「
実行用
ウ
イ
ンド
ウ
」で実
行しなさい
☆
次は,例題4に進んでください
a
(car a)
(cdr a)
「例題3.ペアから構成さ
れたペア」の手順
31
ペアの生成
表示されたペ
ア
32
(define a (cons (c
ons 1 2)
(cons 3 4)))
ペアから構成されたペアは,
「
cons
の入れ子
」で書ける
例題3のプログラム例
33
'c
c
ar
cdr
'a
'b
(cons (cons 'a 'b) 'c)
の箱とポインタ記
法
34
car
cdr
'a
'b
'c
(cons 'a (cons 'b
'c))
の箱とポインタ記
法
35
cons
によるペアの表記
36
•
例題3のペアについて,
car
と
cdr
を組
み合わせて,「1」,「2」,「3」,
「4」を得る
1
2
3
4
例題4.
car
と
cdr
の組み合わせ
37
1.
次を「
定義用
ウ
インド
ウ
」で,実行し
なさい
•
入力した後に,
Ex
ecute
ボタンを押す
(define a (cons (cons
1 2)
(cons 3 4)))
2
.
その後,次を「
実行用
ウ
インド
ウ
」
で実行しなさい
☆
次は,例題4に進んでください
(car (c
ar a))
(cdr (car a))
(car (cdr a))
(cdr (cdr
a))
(caar a)
(cdar a)
(cadr a)
(cddr a)
「例題3.
car
と
cdr
の組み合わせ」の手順
38
39
40
(define a (cons (c
ons 1 2)
(cons 3 4)))
(car (car a))
(cdr (car
a))
(car (cdr a))
(cdr (cdr
a))
例題4のプログラム例
41
1
2
3
4
(car (c
ar a))
(cdr (c
ar a))
(car (cd
r a))
(cdr (cdr a))
car
,
cd
r
の組み合わせ
42
•
(caar p
air)
•
(cadr p
air)
...
•
(cdddr
pair)
car
, cdr
を
4つまで組み合わせる
ことができる
car
,
cd
r
の組み合わせ
43
•
(cons obj1 obj2
)
ペアの生成
•
(car pair)
car
の取り出し
•
(cdr pair)
cdr
の取り出し
•
(caar pair)
•
(cadr pair)
...
•
(cdddr pair)
car
, cdr
を4つまで組み合わ
せることがで
きる
ペアに関する関数
44
•
下記のよ
う
なペアの集まりを,変数
x
として定義する
car
1
2
3
4
5
6
cdr
例題5.
cons
と
list
の組み合わせ
(1)
45
car
(define x (cons (list 1 2 3)
(list 4 5 6)))
1
2
3
4
5
6
cdr
cons
と
list
の組み合わせ
(1/2)
46
47
48
•
下記のよ
う
なペアの集まりを,変数
x
として定義する
car
x
y
b
cdr
a
20
10
例題6.
cons
と
list
の組み合わせ
(2)
49
c
ar
(define
x (list (con
s 'x 'y)
(cons 'a 'b)
(cons 10
20)))
x
y
b
cdr
a
20
10
cons
と
list
の組み合わせ
(2/2)
50
51
•
下記のよ
う
なペアの集まりを,変数
x
として定義する
car
1
2
cdr
3
4
例題7.
list
と
list
の組み合わせ
52
car
(define
x (list (list 1 2)
(list 3 4)))
1
2
cdr
3
4
list
と
list
の組み合わせ
53
54
(cons 'a 'b)
⇒
(a . b)
と表示される
(cons (cons 'a 'b) 'c)
⇒
((a . b) .
c)
と表示される
(cons 'a (cons 'b 'c))
⇒
(a b . c)
と表示される
(cons (cons 'a 'b) (cons 'c 'd))
⇒
(( a . b) c
. d)
と表示される
ドット対の例
55
56
•
ペアの
cdr
がリストになっていない場
合
•
つまり,
cdr
方向にペアの並びをみたとき
に,
末
尾が「空リスト」になっていなければ
⇒
ドットを,末尾の要素の前に追加
ドット対
57
1
2
(cons 1
2)
(1
. 2
)
1
2
(cons (c
ons 1 2) 3)
((1
. 2
)
. 3
)
3
2
3
(cons 1
(cons 2 3))
(1 2
. 3
)
1
58
16
-
3
課題
59
•
実行結果を報告しなさい
•
実行上の注意:
DrScheme
で,必ず「
Full
Scheme
」を選んでから実行すること.
(lis
t
(cons 1 2) (cons 3 4))
(lis
t
(lis
t 1 2) (list 3 4))
(
car
(l
ist ...))
の実行
結果
(
cdr
(li
st ...))
の実行
結果
(
cadr
(l
ist ...))
の実
行結果
(
cddr
(lis
t
...))
の実
行結果
課題
①
60
さらに勉強したい
人への
補足説明
事項
二分探索木
61
例題8.二分探索木
例題9.二分探索木
による探索
・入れ子になった構
造
62
•
幾つかの節点
(node)
と,それらを結ぶ
枝
(b
ranch)
か
ら構成
•
節点がデータに対応
•
枝がデータ間の親子関係に対応
•
子
:
節点の中で下方に分岐する枝の先にあるもの
•
親
:
分岐元の節点
親
子
枝
(br
anch)
節点
(node)
図.単純な木構造
木構造
63
•
根
(root)
:
木の一番上の節点を根
(root)
•
葉
(leaf)
:
子を持たない節点
•
部分木
:
木の中のある節点を相対
的な根と考えた
ときの,そこから枝分かれした枝と節点の集合
部分木
根
(r
oot)
葉
(leaf)
木構造
64
•
木構造で,各節点か
ら出る枝が二本以下のも
の
•
木構造に関するアルゴリズムの中で,中心的
なデータ構造
二分木
(binary
tree)
65
•
二分木の一種
•
データの配置に規則あり
•
左側のすべての子は親より小さい
•
右側のすべての子は親より大きい
•
データの探索のためのデータ構造
35
21
13
40
61
46
69
二分探索木
(binary
search tree)
66
•
根
(root)
から始める
•
探索キーの値と,各
節点のデータを比較し,
目標となるデータを
探す
•
探索キーよりも節点のデータが小さいときは,右
側の子をたどる
•
探索キーよりも節点のデータが大きいときは,左
側の子をたどる
二分探索木による探索
67
(
例)
40
である節点を探す場合
1.
根の値
(35)
と,探索キー
(40)
を比較
2.
探索キーの方が大きいので,右側の子節点へ移る
3.
次に移った節点の値
(46)
と探索キー
(40)
を比較し
4.
探索キーの方が小さいので,左の子節点へ移る
5.
次に移った節点
(40)
が,目標の節点である
35
21
13
40
61
46
69
二分探索木による探索の例
68
•
複雑なプログラムを
作成する時,データ構造
について考える必要
がある
•
データ構造
•
アルゴリズムを容易にするために工夫されたデー
タの並び
•
基本的なデータ構造は,配列,キュー,スタック,
リスト構造,
木構造
など
データ構造
69
(define-str
uct node
(value left right))
left
righ
t
v
alue
left
ri
ght
v
alue
left
ri
ght
v
alue
枝
枝
二分探索木のための
node structure
70
•
二分探
索木のプログラム
を作り,実行する
•
二分探索木の節点を扱
う
ために,
define struct
文
を
使って,
node structure
を定義する
•
1つの二分探索木は,節点が集まって,入れ子の構造
になる
例題8.二分探索木
71
•
二分探索木の節点を,
define-struct
文を使って定義する
(
de
fin
e-s
truct
node
(v
alue le
ft righ
t))
名前
属性の並び
(それぞれの
属性にも名前
がある)
二分探索木の
節点
72
define-
struct
の機能
•
上記のプログラムの実行によって
•
mak
e-node
•
node-v
alue
•
node-left
•
node-right
が使えるよ
う
になる
(
de
fin
e-s
truct
node
(v
alue le
ft righ
t))
属性
v
alue, left,
righ
t
の取得
73
(
mak
e-node
35
(
mak
e-node
21
(
mak
e-node
13
f
alse f
alse)
f
alse)
(
mak
e-node
46
(
mak
e-node
40
f
alse f
alse)
(
mak
e-node
61
f
alse
(
mak
e-node
69
f
alse f
alse))))
35
21
13
40
61
46
69
上のプログラムが表現する
2分探索木
(「
f
alse
」は「データが無い」こと
を示す特別な値)
74
•
二分探索木の探索のプログラムを作り,
実行する
•
データが二分
探索木の中に
あれば
→ true
•
無ければ
→ false
例題9.二分探索木による
探索
75
(defin
e-struct node
(v
alue left righ
t))
(defin
e
(
sear
ch
x a-tree
)
(cond
[(eq?
a
-tr
ee
f
alse) f
alse]
[(<
x
(node-v
alue
a-tr
ee
)) (
sear
ch
x
(node-left
a-tr
ee
))]
[(< (node
-v
alue
a-tr
ee
)
x
) (
search
x
(node-ri
ght
a-tr
ee
))]
[else true]))
左を探す
右を探す
76
77
•
2分探
索木を「入れ子に
なった
node
structur
e
」
として表現した
まとめ
78