1 / 51

リスト

リスト. 【 キーワード 】 リスト,リストのセレクタ, first 部 , rest 部, マップ (map), フィルタ (filter), リストの畳込み. 1. リスト. 任意個数のデータの並び リストの例 ( list 1 2 3 4 ) ( list "book" "pen" ). リスト. 15. 8. 6. 32. 終端. データの集まり (リストを構成する要素には 順序 がある). ( list 15 8 6 32 ). 全体で 1つ の複合データ. 3. リスト(一般形). ( ). <要素値> の 並び.

shasta
Download Presentation

リスト

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. リスト 【キーワード】リスト,リストのセレクタ,first 部, rest 部,マップ (map), フィルタ (filter), リストの畳込み 1

  2. リスト • 任意個数のデータの並び • リストの例 (list1 2 3 4) (list"book" "pen")

  3. リスト 15 8 6 32 終端 データの集まり (リストを構成する要素には順序がある) (list15 8 6 32) 全体で1つの複合データ 3

  4. リスト(一般形) () <要素値> の並び list 1個以上 半角のスペース で区切る 【リストの例】 (list15 8 6 32) 半角の括弧 で囲む このルールを守らないと構文エラー 4

  5. リスト 要素値の並び リストであることを 示すキーワード (list15 8 6 32) 全体で1つの複合データ 5

  6. first 部と rest 部 リストは,要素に順序あり. → 要素を1個以上持つリストは first部と rest部に 分けることができる rest 部 first 部 6 32 8 終端 リスト 要素 first部:リストの先頭要素 rest部:二番目以降の要素のリスト (先頭を除いた残り) 6

  7. リストのセレクタは firstと rest first:リストのfirst部(先頭要素)を得るセレクタ) rest:リストのrest部(二番目以降の要素のリスト)を得るセレクタ リストのセレクタ 7

  8. 要注意 【Racket の実行画面】 Scheme式 (firstempty), (restempty) は,ともに実行時エラー first, restの入力には,空でないリストを与える必要がある 8

  9. リスト処理の例 9

  10. リストに関わる種々の関数(Racket に組み込み済みのもの) 合併 組み込み済みなので Racket ソフトウエアを 起動するとすぐに使える マップ フィルタ ソート リストの畳込み リストの要素数 append map ormap andmap apply filter build-list sort foldr foldl assf lengthなど 10

  11. map関数(リスト1つの場合) (odd? が引数を1つとる関数なので) リスト1つ 元の式 評価結果 リストの全要素に関数 odd? を適用, 評価結果を要素とする新しいリストを作る (list1 2 3) odd?関数を, 1と 2と 3に適用 (listtrue false true) 11

  12. map関数(リスト2つの場合) (+ が引数を2つ以上とる関数なので) リスト2つ 元の式 評価結果 リストの全要素に関数 + を適用, 評価結果を要素とする新しいリストを作る (list1 2) (list3 4) +を適用 (list4 6) 12

  13. ■ 自分で定義し た関数を使う例 関数名fを指定 同じことを行う 2つの方法 ■ 自分で定義し た関数を使う例 ラムダ式を使用 ※ ラムダ式単独なので 関数に名前がない 13

  14. 引数の数が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

  15. sqr: 2乗 add1: (数に) 1足す sub1: (数から) 1引く string?: 文字列ならば true など 引数の数が1つ map の入力は関数と リスト (この場合1つのリスト) 15

  16. quotient: 商 remainder: 剰余 など 引数の数が2つ map の入力は関数と リスト (この場合2つのリスト) 16

  17. + * max: 最大値 など 引数の数が2つ以上 (任意個) map の入力は関数と リスト (この場合2つ以上のリスト) 17

  18. filter関数 リストの全要素に関数を適用し,評価結果が true になるような要素だけを含む新しいリストを作る 関数 リスト 奇数だけを取り出す.リスト内の順序は保つ 18

  19. ■ 自分で定義し た関数を使う例 関数名fを指定 同じことを行う 2つの方法 ■ 自分で定義し た関数を使う例 ラムダ式を使用 ※ ラムダ式単独なので 関数に名前がない 19

  20. ormap関数 リストの要素に,所定の条件関数を適用した結果が,1つでも true になる場合には true 条件関数(ブール値を返す関数) リスト 奇数を1つでも含めば true 20

  21. ■ 自分で定義し た関数を使う例 関数名fを指定 同じことを行う 2つの方法 ■ 自分で定義し た関数を使う例 ラムダ式を使用 ※ ラムダ式単独なので 関数に名前がない 21

  22. リストの畳み込み とは 【畳み込みの例】 (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

  23. 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

  24. 実習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

  25. 数のリストに対して,要素の総和を求める関数sum数のリストに対して,要素の総和を求める関数sum 【入力と出力の関係】 (sumempty) ->0 (sum(conse L)) ->(+e(sum L)) 25

  26. 数のリストに対して,要素の総和を求める関数sum数のリストに対して,要素の総和を求める関数sum 【入力と出力の関係】 (sumempty) ->0 (sum(conse L)) ->(+e(sum L)) ● 入力が空リストのとき     出力は 0 ● 入力が リスト (conse L)のとき     出力は,(+e (sum L))と定義される 26

  27. 数のリストに対して,要素の総和を求める関数sum数のリストに対して,要素の総和を求める関数sum 【入力と出力の関係】 (sumempty) ->0 (sum(conse L)) ->(+e(sum L)) 【関数定義の例 (foldr を利用しない場合)】 (define (sum alon) (cond [(empty?alon) 0] [else (+ (firstalon) (sum (restalon))])) 27

  28. 数のリストに対して,要素の総和を求める関数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

  29. 数のリストに対して,要素の 総和を求める関数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

  30. 2つのベクトルの内積 【説明用の例題】 x, yは数のリストとする (要素数 n) ■ 説明を簡単にするため,x, yの要素数は等しい    と仮定する 30

  31. sort 関数によるソート リストの要素を,ある規則で並べ替え 32

  32. length 関数 リストの要素数 33

  33. Scheme処理系の実演 34

  34. Racket の使用準備 Racket の起動 実演では「Advanced Student」に設定 言語 → 言語の選択 → Advanced Student → 「実行」ボタン 35 35

  35. 実演1. リスト 「list」 を使ってリストを書く 15 8 6 32 23 手順:次の式を「対話ウインドウ」で評価させる (list 15 8 6 32 23)

  36. 実行結果の例 「(list 15 8 6 32 23)」 を入力すると 「(list 15 8 6 32 23)」 と表示される

  37. 実演2. リストの first と rest • 要素が1つしか無いリスト (list 15)に対して,firstと restを適用する rest部 first部 15 empty 手順:次の式を「対話ウインドウ」で評価させる (first (list15)) (rest (list15))

  38. 実行結果の例 first を含む式 rest を含む式 emptyは空リスト(要素数0のリスト) を表す DrScheme のキーワード

  39. 実習3. リストの基本操作 リストの第三要素を得る関数 element3を定義し,リストを適用する. 例) 15 8 6 32 23 3番目 element3 出力 入力 6 (list 158 6 32 23)

  40. firstと restを使い第三要素を求める = リストの rest 部の rest 部の first 部 15 8 6 32 23 first rest rest

  41. 実演3の手順 • 「定義ウインドウ」で,次の関数定義を行う (define (element3 L) (first (rest (restL)))) 2. その後,次の式を「対話ウインドウ」で評価させる (element3 (list15 8 6 32 23)) 42 42

  42. 実行結果の例

  43. 実演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

  44. 実行結果の例 45

  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

  46. 実行結果の例

  47. 実習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

  48. 実行結果の例

  49. 実習7. filter関数 • 数のリストについて, 10 以上の要素だけを抜き出す • 「定義ウインドウ」で,次の関数定義を行う (define (f x) (>=x 10)) 2. その後,次の式を「対話ウインドウ」で評価させる (filter f (list11 2 13 4 15)) (filter f (list5 10 15 20)) 50

More Related