1 / 58

【 キーワード 】 値,関数,関数定義,パラメータ, 関数の再帰的定義

関数. 【 キーワード 】 値,関数,関数定義,パラメータ, 関数の再帰的定義. 1. 円の面積. 半径 r の円の面積は π r 2. r ( 円の半径 ). 2. 関数定義の一般形. (define ( <関数名> <パラメータ>の 並び ) <本体式> ). 関数定義の例. ( define ( area-of-disk r ) ( * 3.14 ( * r r ))). π=3.14 で近似. 本体式は, r を含む Scheme の式 (円の面積は r を含む式で 表現). 3. 3. 関数定義の例.

sachi
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. 関数 【キーワード】値,関数,関数定義,パラメータ,関数の再帰的定義 1

  2. 円の面積 半径 r の円の面積は πr2 r(円の半径) 2

  3. 関数定義の一般形 (define (<関数名> <パラメータ>の並び) <本体式>) 関数定義の例 (define (area-of-diskr) (*3.14 (*r r))) π=3.14で近似 本体式は,rを含む Scheme の式 (円の面積は rを含む式で表現) 3 3

  4. 関数定義の例 定義ウインドウで,関数定義を行う 4 4

  5. 関数定義の読み込み 実行ボタンを押して, 関数定義を,読み込ませる このとき、対話ウインドウ の中身はクリアされる 読み込ませた関数 area-of-disk を使ってみよう 5 5

  6. 関数適用の例 対話ウインドウで、 (area-of-disk5) と入力して、Enter キーを押す ※ DrScheme は,関数 area-of-diskの本体式の中のパラメータ rを 5 に置き換えた後,本体式を評価する) 6 6

  7. 関数適用の例 式の評価結果である「78.5」 が表示される  (確かに 5×5×3.14 = 78.5) 7 7

  8. パラメータ r r area-of-disk (* 3.14 (* r r)) rを含む Scheme の式 5 から 78.5 が求まる 10 から 314 が求まる 8

  9. r area-of-disk (* 3.14 (* r r)) パラメータ 関数名 関数の本体式 (パラメータ r を含むScheme の式) 9

  10. (area-of-disk 5)の評価では 5 5 を,関数 area-of-diskに適用 r 5 78.5 area-of-disk パラメータ rが 5 に置き換わる (* 3.14 (* 55)) (* 3.14 (* r r)) パラメータ rが 5 に 置き換わる (* 3.14 (* 55)) (* 3.14 25) 78.5 10

  11. 入力 出力 5 78.5 area-of-disk 数が 求まる 数から 関数 入力から出力を求める手順を本体式に記述 (本体式は,パラメータを含む式) 11

  12. 関数適用とは 関数のパラメータを,実際の値で置き換えて,関数の本体式を評価すること (例) (area-of-disk 5) ・・・ 引数 5 を,関数  area-of-diskに適用 ・関数には,入力(与えるデータ)と出力(受け取る結果)がある ・関数適用では,関数名(関数定義において付ける関数の名前)と,必要な引数を記述する 出力 入力 area-of-disk r の値: 5 78.5 (area-of-disk 5) 引数 5 を, 関数 area-of-disk に適用 (本体式の評価の前に rは5で置換される) (* 3.14 (* 5 5)) = (* 3.14 25) = 78.5 12

  13. cond 文を本体式の持つ関数の例 (define (<関数名> <パラメータ>の並び) <本体式>) 【関数定義の一般形】 【条件定義の例】 (define (f1 x) (cond [(<x0) 0] [(<x5) (*2x)] [else (- (*4x) 10)])) 本体式が cond 文を含む 13

  14. 各状況ごとに,条件節(= Question +Answer) (define (f1 x) (cond [(<x0) 0] [(<x5) (*2x)] [else (- (*4x) 10)])) 式 条件式または else Question Answer 14

  15. (f1 5)の評価では 5 引数 5を,関数 f1に適用 f1 x 5 10 パラメータ x が 5 に 置き換わる (cond [(<5 0) 0] [(<5 5) (* 2 5)] [else (- (* 4 5) 10)])) (cond [(<x0) 0] [(<x5) (*2x)] [else (- (*4x) 10)])) 関数の 本体式 (cond [(<50) 0] [(<55) (*25)] [else (- (*45) 10)])) パラメータx が 5に 置き換わる 10 15

  16. 関数の再帰的定義 【説明用の例題】 (但し,xは 0 以上の整数とする) 数の総和.例えば f1(3) = 0+1+2+3 = 6 16

  17. (但し,xは 0 以上の整数) 意味は同じ (但し,xは 0 以上の整数) 17

  18. 再帰的定義 この場合 f1(3) の値は ・・・ f1(2) の値は ・・・ f1(1) の値は ・・・ f1(0) の値は ・・・ f1(2) を使って定義 ( f1(3) = 3+f1(2) ) f1(1) を使って定義 ( f1(2) = 2+f1(1) ) f1(0) を使って定義 ( f1(1) = 1+f1(0) ) 0 ※ 数の総和 f1(x) が f1(x-1)を使って定義されている (但し,xは 0 以上の整数) 18

  19. 【 Scheme の関数定義 (cond 文を使って定義)】 (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 基底ケース (base case) 基底ケースは, 自己参照を含まない cond 文 (但し,xは 0 以上の整数) 19

  20. 再帰の終了条件 (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 基底ケース (base case) 出力は 0 (但し,xは 0 以上の整数) 20

  21. (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 自己参照のケース 自己参照 cond 文が,自己参照 のケースを含む = 再帰的定義 (但し,xは 0 以上の整数) 21

  22. (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) ① まず f1の適用   (中間結果を得る) ② 中間結果を使って,最終結果を得る (但し,xは 0 以上の整数) 22

  23. もし x=0ならば 評価順 (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) x = 0 のとき 評価される部分 無視される ① x = 0 のときは trueになる 23

  24. もし x>0ならば 評価順 (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 無視される ① x > 0 のときは falseになる 24

  25. もし x>0ならば 評価順 (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) x>0のとき 評価される部分 ① ② 25

  26. 【0からxまでの和】 再帰的定義 「xまでの和」が,「x-1 までの和」を使って定義される.(より「簡単な場合」に帰着させるので,循環定義ではない) 【Scheme の関数定義の例】 • 関数の本体式が,自分自身の関数適用(自己参照)を含む (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 自己参照 ※ sub1は 1引く関数 26

  27. 【cond文】 1.基底ケース (base case) 再帰の終了条件を定める  2.自己参照のケース     自己参照を含む.     部分的な結果(中間結果)から,最終結果を得る (例) 中間結果: n-1 までの和. 最終結果: nまでの和       この場合,中間結果に nを足すと,最終結果が得       られる (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 自己参照 27

  28. ラムダ式の例 (define (decn) (-n 1)) 同じ意味 (definedec (lambda(n) (-n 1)))

  29. Scheme処理系の実演 29

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

  31. 定義ウインドウ (Definition Window) 対話ウインドウ (Interaction Window) Enter を契機に動く Runボタンを契機に動く 定義ウインドウには エディタの機能がある ※ マウス,矢印キー,バックスペスキーなどでさかのぼって編集できる 31 31

  32. 実演1.関数定義における構文エラー (define (<関数名><パラメータ>の並び) <本体式>) <関数定義の例> 関数名 area-of-disk,パラメータ r (define (area-of-disk r) (* 3.14 (*r r))) 【関数定義の一般形】 32

  33. 構文エラーの例 かっこの数が多い 関数定義の中に, 構文エラー(Syntax Error) がある 33 33

  34. 実行ボタンを押すと・・・ 関数定義の中に構文エラーがあるので, エラーメッセージが出る 34 34

  35. 定義ウインドウは, エディタの機能がある. マウス,矢印キー, バックスペースキー などを使って,修正する 35 35

  36. 修正後は,実行ボタンを押して,関数定義を再度読み込ませる修正後は,実行ボタンを押して,関数定義を再度読み込ませる エラーメッセージが消える

  37. 実演2.関数定義における構文エラー (define (<関数名><パラメータ>の並び) <本体式>) (define (foor) (+r 100)) 【関数定義の一般形】 37

  38. 構文エラーの例 関数定義の中に, 構文エラー(Syntax Error) がある 「+」と「r」の間に 半角スペースが無い 38 38

  39. 実行ボタンを押すと・・・ 関数定義の中に構文エラーがあるので, エラーメッセージが出る 39 39

  40. 実演3. リングの面積  外径 outer、内径 innerからリングの面積を求める関数 area-of-ringを定義する 円の面積を求める関数area-of-diskを,補助関数として使う outer 真ん中に穴のあいた 円の面積と考える inner

  41. リングの面積 リングの面積 = 外側の円の面積 - 内側の円の面積 outer 外径: outer 内径: inner inner 半径 outerの円 半径 innerの円

  42. 実演3 • 「定義ウインドウ」で,次の関数定義を行う (define (area-of-disk r) (*3.14 (*r r))) (define (area-of-ringouter inner) (- (area-of-diskouter) (area-of-diskinner))) 2. その後,次の式を「対話ウインドウ」で評価させる (area-of-ring5 3) 42 42

  43. 実演4.2次方程式 • 2次方程式 ax2 + bx + c = 0 の解を求める関数 quadratic-rootsを定義し,実行する • 2つの解を「リスト」として出力する • 重解を求める • 但し,虚数解は考えない • a = 0 の場合も考えない 出力は ・1つのリスト ・1つの数値 ・シンボル 'None のどれか quadratic-roots 入力は 3つの数値

  44. 実演4の手順 • 「定義ウインドウ」で,次の関数定義を行う (define (Da b c) (- (* b b) (* 4 a c))) (define (quadratic-roots a b c) (cond [(< (Da b c) 0) 'None] [(= (Da b c) 0) (- (/ b (* 2 a)))] [else (list (/ (+ (- b) (sqrt (Da b c))) (* 2 a)) (/ (+ (- b) (- (sqrt (Da b c)))) (* 2 a)))])) • その後,次の式を「対話ウインドウ」で評価させる (quadratic-roots 1 -5 6) (quadratic-roots 2 0 -1) (quadratic-roots 1 2 1) (quadratic-roots 1 0 1)

  45. まず,関数を定義している

  46. 実行結果が,リスト,数値,シンボル で得られている 

  47. 変数 x の二次方程式の一般形: • ax2 + bx + c = 0 • 二次方程式の解の数: • 係数 a,b,cの値に依存 • (1) a = 0 ⇒ 方程式は degenerate • (2) a ≠ 0 ⇒ proper な二次方程式 • もし b2 > 4ac なら  二つの解 • もし b2 = 4ac なら 一つの解 • もし b2 < 4ac なら 解無し

  48. 判別式 D = b2 - 4ac とする 1) D > 0 のとき 2) D = 0 のとき 3) D < 0 のとき 異なる2実数解 重解(解の個数は1) 解なし

  49. quadraric-roots 関数 (define (Da b c) (- (* b b) (* 4 a c))) (define (quadratic-roots a b c) (cond [(< (Da b c) 0) 'None] [(= (Da b c) 0) (- (/ b (* 2 a)))] [else (list (/ (+ (- b) (sqrt (Da b c))) (* 2 a)) (/ (+ (- b) (- (sqrt (Da b c)))) (* 2 a)))])) 解なし 重解(解の個数は1) 異なる2実数解

More Related