1 / 26

今日の内容

今日の内容. 相互参照(再帰的)データ構造 局所定義 局所変数、局所関数. リスト (list) と構造 (structure) の混じった例. 家系図の定義と処理 先週とは,リンクが逆向き 先週は,父と母にリンクがあった 今週は,子供の( リスト )へのリンクがある. 再帰的な構造:家系図. Carl (1926) green. Bettina (1926) green. Adam (1950) yeloow. Dave(1955) black. Eva (1965) blue. Fred (1966) pink. Gustav (1988) brown.

woody
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. 今日の内容 • 相互参照(再帰的)データ構造 • 局所定義 • 局所変数、局所関数

  2. リスト(list)と構造(structure)の混じった例 • 家系図の定義と処理 • 先週とは,リンクが逆向き • 先週は,父と母にリンクがあった • 今週は,子供の(リスト)へのリンクがある

  3. 再帰的な構造:家系図 Carl (1926)green Bettina (1926)green Adam (1950)yeloow Dave(1955)black Eva (1965)blue Fred (1966)pink Gustav (1988)brown

  4. Parentのデータ構造の定義 • parent は構造: • (define-struct parent (loc name date eyes)) • locはchildrenのリスト • nameは名前 • dateは生年 • eyesは目の色 • (make-parent aloc aname adate aneye) • aloc はchildrenのリスト • aname と aneye は シンボル • adate は数

  5. Childrenのリストの定義 • childrenのリスト • empty • (cons p loc) • p は parent • loc は childrenのリスト

  6. 相互参照定義 • parent は以下の構造 • (make-parent aloc n d e) • alocはchildrenのリスト, n と e は シンボル, d は数 • A list of children • empty • (cons p aloc) • p は parent • alocは childrenのリスト

  7. 相互参照:プログラムの基本構造 • 相互再帰的な関数 (define (func-on-parent p) ;; 家系図に対する関数 … (func-on-childlen (parent-loc p))…)) (define (func-on-children aloc);; 家系図のリストに対する関数 (cond [(empty? aloc) … ] [else … (func-on-parent (first aloc)) … … (func-on-children (rest aloc))…]))

  8. blue-eyed-descendant? : ftn -> boolean ; blue-eyed-descendant? : ftn (family tree node) -> boolean ;; parent あるいはその子孫が青い目であるか判定する (define (blue-eyed-descendant? aparent) ...)

  9. 答えの例 (blue-eyed-descendant? Gustav) = false (blue-eyed-descendant? Eva) = true (blue-eyed-descendant? Bettina) = true

  10. blue-eyed-descendant? のプログラム ;; blue-eyed-descendant? : ftn -> boolean ;; parent あるいはその子孫が青い目であるか判定する (define (blue-eyed-descendant? aparent) (cond [(symbol=? (parent-eyes aparent) 'blue) true] [else (blue-eyed-children? (parent-loc aparent))]))

  11. blue-eyed-children? ;; blue-eyed-children? : list-of-children -> boolean ;; alocに含まれるparentが青い目かその子孫が青い目が ;; を判定する (define (blue-eyed-children? aloc) (cond [(empty? aloc) false] [else (cond [(blue-eyed-descendant? (first aloc)) true] [else (blue-eyed-children? (rest aloc))])]))

  12. blue-eyed-descendant?の見直し (define (blue-eyed-descendant? aparent) (or (symbol=? (parent-eyes aparent) 'blue) (blue-eyed-children? (parent-loc aparent))))

  13. blue-eyed-children? の見直し (define (blue-eyed-children? aloc) (cond [(empty? aloc) false] [else (or (blue-eyed-descendant? (first aloc)) (blue-eyed-children? (rest aloc)))]))

  14. Web ページに関する問題 • Web に、ある特定の記号が現れるかを調べる • 関数 occurs を定義する

  15. Web ページの定義 • Web ページは次のように定義される構造 • (define-struct wp (header body)) • ここで,headerはシンボルでbodyは(Webの)ドキュメント • ドキュメントは • empty • (cons s p) • s はシンボルで p はドキュメント • (cons w p) • w は Web ページ で p はドキュメント

  16. Web ページの例 • Webページ: (make-wp シンボルドキュメント) • ドキュメント: empty (list Item …. Item) • Item: シンボル あるいはWebページ • (make-wp ‘a (list ‘b ‘x)) • (make-wp ‘a (list (make-wp ‘c empty) (make-wp ‘d (list (make-wp ‘a (list ’b ‘x))))))

  17. Webページ:プログラムの基本構造 (define (func-on-wp wp) ;; ウェブページに対する関数 … (func-on-doc (wp-body wp))…)) (define (func-on-doc adoc);; ドキュメントに対する関数 (cond [(empty? adoc) … ] [(symbol? (frist adoc)) … (func-on-doc (rest adoc)) …] [ else … (func-on-wp (first adoc)) … … (func-on-doc (rest adoc))…]))

  18. occur ;web ページを定義する (define-struct wp (header body)) ;web ページ awp に記号asymbが現れるか ; どうかを調べる (define (occurs asymb awp) (or (symbol=? asymb (wp-header awp)) (occurs-webdoc asymb (wp-body awp))))

  19. occurs-webdoc ;webドキュメントawebdoc にシンボルasymbが現れる ; かどうかを調べる (define (occurs-webdoc asymb awebdoc) (cond [(empty? awebdoc) false] [(symbol? (first awebdoc)) (or (symbol=? (first awebdoc) asymb) (occurs-webdoc asymb (rest awebdoc)))] [else (or (occurs asymb (first awebdoc)) (occurs-webdoc asymb (rest awebdoc)))]))

  20. 局所変数 • (let ((<変数> <式>) … (<変数> <式>)) <式>) • <変数> は,<式>の中でのみ有効 • 例: f(x,y) = x(1 + xy)2+y(1 – y) + (1 + xy)(1- y) • a = 1 + xy • b = 1 – y • f (x,y) = xa2 + yb + ab

  21. 局所変数 • 例: f(x,y) = x(1 + xy)2+y(1 – y) + (1 + xy)(1- y) • a = 1 + xy • b = 1 – y • f (x,y) = xa2 + yb + ab • プログラム (define (f x y) (let ((a (+ 1 (* x y))) (b (- 1 y))) (+ (* x a a) (* y b) (* a b))))

  22. 局所関数の定義 • 関数定義の中で,defineを用いて局所関数を定義できる (define (f2 x y) (define (f-helper a b) (+ (* x a a) (* y b) (* a b))) (f-helper (+ 1 (* x y)) (- 1 y)))

  23. 局所的な相互再帰関数の定義 (define (myodd? an) (define (odd-helper? an) (cond [(zero? an) false] [else (even-helper? (sub1 an))])) (define (even-helper? an) (cond [(zero? an) true] [else (odd-helper? (sub1 an))])) (odd-helper? an))

  24. 局所定義による単純挿入法 (define (sort alon) (cond [(empty? alon) empty] [(cons? alon) (insert (first alon) (sort (rest alon)))])) (define (insert an alon) (cond [(empty? alon) (list an)] [else (cond [(> an (first alon)) (cons an alon)] [else (cons (first alon) (insert an (rest alon)))])]))

  25. 局所関数を用いたsortの再定義 (define (sort2 alon) (define (insert an alon) (cond [(empty? alon) (list an)] [else (cond [(> an (first alon)) (cons an alon)] [else (cons (first alon) (insert an (rest alon)))])])) (cond [(empty? alon) empty] [(cons? alon) (insert (first alon) (sort (rest alon)))]))

  26. 問題1:プログラムの基本構造 • 相互再帰的な関数 (define (func-on-tree t) ;; 木に対する関数 … (tree-label t)… … (func-on-childlen (tree-children t))…)) (define (func-on-children ts);; 木のリストに対する関数 (cond [(empty? ts) … ] [else … (func-on-tree (first ts)) … … (func-on-children (rest ts))…]))

More Related