510 likes | 758 Views
リスト. 【 キーワード 】 リスト,リストのセレクタ, first 部 , rest 部, マップ (map), フィルタ (filter), リストの畳込み. 1. リスト. 任意個数のデータの並び リストの例 ( list 1 2 3 4 ) ( list "book" "pen" ). リスト. 15. 8. 6. 32. 終端. データの集まり (リストを構成する要素には 順序 がある). ( list 15 8 6 32 ). 全体で 1つ の複合データ. 3. リスト(一般形). ( ). <要素値> の 並び.
E N D
リスト 【キーワード】リスト,リストのセレクタ,first 部, rest 部,マップ (map), フィルタ (filter), リストの畳込み 1
リスト • 任意個数のデータの並び • リストの例 (list1 2 3 4) (list"book" "pen")
リスト 15 8 6 32 終端 データの集まり (リストを構成する要素には順序がある) (list15 8 6 32) 全体で1つの複合データ 3
リスト(一般形) () <要素値> の並び list 1個以上 半角のスペース で区切る 【リストの例】 (list15 8 6 32) 半角の括弧 で囲む このルールを守らないと構文エラー 4
リスト 要素値の並び リストであることを 示すキーワード (list15 8 6 32) 全体で1つの複合データ 5
first 部と rest 部 リストは,要素に順序あり. → 要素を1個以上持つリストは first部と rest部に 分けることができる rest 部 first 部 6 32 8 終端 リスト 要素 first部:リストの先頭要素 rest部:二番目以降の要素のリスト (先頭を除いた残り) 6
リストのセレクタは firstと rest first:リストのfirst部(先頭要素)を得るセレクタ) rest:リストのrest部(二番目以降の要素のリスト)を得るセレクタ リストのセレクタ 7
要注意 【Racket の実行画面】 Scheme式 (firstempty), (restempty) は,ともに実行時エラー first, restの入力には,空でないリストを与える必要がある 8
リスト処理の例 9
リストに関わる種々の関数(Racket に組み込み済みのもの) 合併 組み込み済みなので Racket ソフトウエアを 起動するとすぐに使える マップ フィルタ ソート リストの畳込み リストの要素数 append map ormap andmap apply filter build-list sort foldr foldl assf lengthなど 10
map関数(リスト1つの場合) (odd? が引数を1つとる関数なので) リスト1つ 元の式 評価結果 リストの全要素に関数 odd? を適用, 評価結果を要素とする新しいリストを作る (list1 2 3) odd?関数を, 1と 2と 3に適用 (listtrue false true) 11
map関数(リスト2つの場合) (+ が引数を2つ以上とる関数なので) リスト2つ 元の式 評価結果 リストの全要素に関数 + を適用, 評価結果を要素とする新しいリストを作る (list1 2) (list3 4) +を適用 (list4 6) 12
■ 自分で定義し た関数を使う例 関数名fを指定 同じことを行う 2つの方法 ■ 自分で定義し た関数を使う例 ラムダ式を使用 ※ ラムダ式単独なので 関数に名前がない 13
引数の数が1つ 引数の数が2つ • add1: 1足す • sub1: 1引く • abs: 絶対値 • sqr: 2乗 • odd?: 奇数なら true • even?: 偶数なら true • 【対数・三角関数】 • log • sin • cos • tan • atan • 【データ型の判定】 • number? • char? • string? • symbol? • boolean? • empty? • cons? • struct? • など quotient: 商 remainder: 剰余 expt: 指数 など 引数の数が2つ以上 ※ 3つ,4つ・・・も可 【四則演算】 +, -, *, / 【最大・最小】 max min 【数の比較】 <,<=,>,>=,= 【文字列の比較(辞書順)】 string<?,string<=?, string>?,string>=?, string=? など (+ 1 2 3) (max 10 20 30) のような式を書いて よい ということ 14
sqr: 2乗 add1: (数に) 1足す sub1: (数から) 1引く string?: 文字列ならば true など 引数の数が1つ map の入力は関数と リスト (この場合1つのリスト) 15
quotient: 商 remainder: 剰余 など 引数の数が2つ map の入力は関数と リスト (この場合2つのリスト) 16
+ * max: 最大値 など 引数の数が2つ以上 (任意個) map の入力は関数と リスト (この場合2つ以上のリスト) 17
filter関数 リストの全要素に関数を適用し,評価結果が true になるような要素だけを含む新しいリストを作る 関数 リスト 奇数だけを取り出す.リスト内の順序は保つ 18
■ 自分で定義し た関数を使う例 関数名fを指定 同じことを行う 2つの方法 ■ 自分で定義し た関数を使う例 ラムダ式を使用 ※ ラムダ式単独なので 関数に名前がない 19
ormap関数 リストの要素に,所定の条件関数を適用した結果が,1つでも true になる場合には true 条件関数(ブール値を返す関数) リスト 奇数を1つでも含めば true 20
■ 自分で定義し た関数を使う例 関数名fを指定 同じことを行う 2つの方法 ■ 自分で定義し た関数を使う例 ラムダ式を使用 ※ ラムダ式単独なので 関数に名前がない 21
リストの畳み込み とは 【畳み込みの例】 (list1 2 3 4 5)を, 関数「*」と,ベース値「1」を使って畳み込むと (*1 (*2 (*3 (*4 (*5 1))))) -> 120 • リスト (list e1, e2, …., en) に対して(op e1 (ope2 … (openbase) … )) を求める リストの全要素を,2引数関数 opを使って,1つにまとめる 22
foldr関数 リストの畳み込みを行う. Racket に組み込み済みの関数 (foldr +0 (list1 2 3 4 5)) -> 15 (+1 (+2 (+3 (+4 (+5 0))))) 関数 foldrに,3つの引数 +, 1, (list 1 2 3 4 5) を適用 (foldr * 1 (list1 2 3 4 5)) -> 120 (*1 (*2 (*3 (*4 (*5 1))))) 関数 foldrに,3つの引数 *, 1, (list 1 2 3 4 5) を適用 23
実習5.リストの畳み込み(2) PERSON 構造体のリストについて, ageフィールドの値が 35以上の要素 があれば true, なければ false を出力する関数35orMore? 【入力と出力の関係(振る舞い)】 (35orMore?empty) ->true (35orMore(conse L)) ->(or (>= (PERSON-agee) 35) (35orMore? L)) 【foldr 関数の入力と出力の関係(振る舞い)】 (foldr opbase empty) -> base (foldr opbase(cons e L)) -> (op e (foldr op base L)) 24
数のリストに対して,要素の総和を求める関数sum数のリストに対して,要素の総和を求める関数sum 【入力と出力の関係】 (sumempty) ->0 (sum(conse L)) ->(+e(sum L)) 25
数のリストに対して,要素の総和を求める関数sum数のリストに対して,要素の総和を求める関数sum 【入力と出力の関係】 (sumempty) ->0 (sum(conse L)) ->(+e(sum L)) ● 入力が空リストのとき 出力は 0 ● 入力が リスト (conse L)のとき 出力は,(+e (sum L))と定義される 26
数のリストに対して,要素の総和を求める関数sum数のリストに対して,要素の総和を求める関数sum 【入力と出力の関係】 (sumempty) ->0 (sum(conse L)) ->(+e(sum L)) 【関数定義の例 (foldr を利用しない場合)】 (define (sum alon) (cond [(empty?alon) 0] [else (+ (firstalon) (sum (restalon))])) 27
数のリストに対して,要素の総和を求める関数sum数のリストに対して,要素の総和を求める関数sum 【入力と出力の関係】 (sumempty) ->0 (sum(conse L)) ->(+e(sum L)) 【foldr 関数の入力と出力の関係】 (foldr opbase empty) -> base (foldr opbase(cons e L)) -> (op e (foldr op base L)) このような対応がとれる ということは,foldr が sum の抽象関数である ということ sum はfoldrop base 0は base +は opと対応 28
数のリストに対して,要素の 総和を求める関数sum 【入力と出力の関係】 (foldr +0 empty) -> 0 (foldr +0(cons e L)) -> (+ e (foldr + 0 L)) (sumempty) ->0 (sum(conse L)) ->(+e(sum L)) foldr は sum の抽象関数 【関数定義の例 (foldr を利用する場合)】 関数 foldr は定義済み (define (sum alon) (foldr+ 0alon))) base は 0, op は + 29
2つのベクトルの内積 【説明用の例題】 x, yは数のリストとする (要素数 n) ■ 説明を簡単にするため,x, yの要素数は等しい と仮定する 30
sort 関数によるソート リストの要素を,ある規則で並べ替え 32
length 関数 リストの要素数 33
Scheme処理系の実演 34
Racket の使用準備 Racket の起動 実演では「Advanced Student」に設定 言語 → 言語の選択 → Advanced Student → 「実行」ボタン 35 35
実演1. リスト 「list」 を使ってリストを書く 15 8 6 32 23 手順:次の式を「対話ウインドウ」で評価させる (list 15 8 6 32 23)
実行結果の例 「(list 15 8 6 32 23)」 を入力すると 「(list 15 8 6 32 23)」 と表示される
実演2. リストの first と rest • 要素が1つしか無いリスト (list 15)に対して,firstと restを適用する rest部 first部 15 empty 手順:次の式を「対話ウインドウ」で評価させる (first (list15)) (rest (list15))
実行結果の例 first を含む式 rest を含む式 emptyは空リスト(要素数0のリスト) を表す DrScheme のキーワード
実習3. リストの基本操作 リストの第三要素を得る関数 element3を定義し,リストを適用する. 例) 15 8 6 32 23 3番目 element3 出力 入力 6 (list 158 6 32 23)
firstと restを使い第三要素を求める = リストの rest 部の rest 部の first 部 15 8 6 32 23 first rest rest
実演3の手順 • 「定義ウインドウ」で,次の関数定義を行う (define (element3 L) (first (rest (restL)))) 2. その後,次の式を「対話ウインドウ」で評価させる (element3 (list15 8 6 32 23)) 42 42
実演4.first と rest の組み合わせ 次の式を「対話ウインドウ」で評価させる (rest (list1 2 3)) (first (rest (list1 2 3))) (rest (rest (list1 2 3))) (first (rest (rest (list1 2 3)))) (rest (rest (rest (list1 2 3)))) 44 44
実行結果の例 45
実演5.リストの畳込みの例 次の式を「対話ウインドウ」で評価させる • (foldr+0 (list1 24 8)) • (foldr *1 (list1 2 4 8)) • (foldr-0 (list100 10 1)) (+1 (+2 (+4 (+8 0)))) (*1 (*2 (*4 (*8 1)))) (-100 (-10 (-1 0))) 46 46
実習6. ormap関数 • 数値リストを入力として,5 を1つ以上含むときのみtrueを返す(その他の場合は falseを返す) • 「定義ウインドウ」で,次の関数定義を行う (define (f x) (=x 5)) 2. その後,次の式を「対話ウインドウ」で評価させる (ormap f (list1 2 3 4)) (ormap f (list1 2 3 4 5)) 48
実習7. filter関数 • 数のリストについて, 10 以上の要素だけを抜き出す • 「定義ウインドウ」で,次の関数定義を行う (define (f x) (>=x 10)) 2. その後,次の式を「対話ウインドウ」で評価させる (filter f (list11 2 13 4 15)) (filter f (list5 10 15 20)) 50