580 likes | 756 Views
関数. 〠ã‚ーワード 】 値,関数,関数定義,パラメータ, 関数ã®å†å¸°çš„定義. 1. 円ã®é¢ç©. åŠå¾„ r ã®å††ã®é¢ç©ã¯ Ï€ r 2. r ( 円ã®åŠå¾„ ). 2. 関数定義ã®ä¸€èˆ¬å½¢. (define ( <関数å> <パラメータ>㮠並㳠) <本体å¼ï¼ž ). 関数定義ã®ä¾‹. ( define ( area-of-disk r ) ( * 3.14 ( * r r ))). Ï€=3.14 ã§è¿‘ä¼¼. 本体å¼ã¯ï¼Œ r ã‚’å«ã‚€ Scheme ã®å¼ (円ã®é¢ç©ã¯ r ã‚’å«ã‚€å¼ã§ 表ç¾ï¼‰. 3. 3. 関数定義ã®ä¾‹.
E N D
関数 【キーワード】値,関数,関数定義,パラメータ,関数の再帰的定義 1
円の面積 半径 r の円の面積は πr2 r(円の半径) 2
関数定義の一般形 (define (<関数名> <パラメータ>の並び) <本体式>) 関数定義の例 (define (area-of-diskr) (*3.14 (*r r))) π=3.14で近似 本体式は,rを含む Scheme の式 (円の面積は rを含む式で表現) 3 3
関数定義の例 定義ウインドウで,関数定義を行う 4 4
関数定義の読み込み 実行ボタンを押して, 関数定義を,読み込ませる このとき、対話ウインドウ の中身はクリアされる 読み込ませた関数 area-of-disk を使ってみよう 5 5
関数適用の例 対話ウインドウで、 (area-of-disk5) と入力して、Enter キーを押す ※ DrScheme は,関数 area-of-diskの本体式の中のパラメータ rを 5 に置き換えた後,本体式を評価する) 6 6
関数適用の例 式の評価結果である「78.5」 が表示される (確かに 5×5×3.14 = 78.5) 7 7
パラメータ r r area-of-disk (* 3.14 (* r r)) rを含む Scheme の式 5 から 78.5 が求まる 10 から 314 が求まる 8
r area-of-disk (* 3.14 (* r r)) パラメータ 関数名 関数の本体式 (パラメータ r を含むScheme の式) 9
(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
入力 出力 5 78.5 area-of-disk 数が 求まる 数から 関数 入力から出力を求める手順を本体式に記述 (本体式は,パラメータを含む式) 11
関数適用とは 関数のパラメータを,実際の値で置き換えて,関数の本体式を評価すること (例) (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
cond 文を本体式の持つ関数の例 (define (<関数名> <パラメータ>の並び) <本体式>) 【関数定義の一般形】 【条件定義の例】 (define (f1 x) (cond [(<x0) 0] [(<x5) (*2x)] [else (- (*4x) 10)])) 本体式が cond 文を含む 13
各状況ごとに,条件節(= Question +Answer) (define (f1 x) (cond [(<x0) 0] [(<x5) (*2x)] [else (- (*4x) 10)])) 式 条件式または else Question Answer 14
(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
関数の再帰的定義 【説明用の例題】 (但し,xは 0 以上の整数とする) 数の総和.例えば f1(3) = 0+1+2+3 = 6 16
(但し,xは 0 以上の整数) 意味は同じ (但し,xは 0 以上の整数) 17
再帰的定義 この場合 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
【 Scheme の関数定義 (cond 文を使って定義)】 (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 基底ケース (base case) 基底ケースは, 自己参照を含まない cond 文 (但し,xは 0 以上の整数) 19
再帰の終了条件 (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 基底ケース (base case) 出力は 0 (但し,xは 0 以上の整数) 20
(define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 自己参照のケース 自己参照 cond 文が,自己参照 のケースを含む = 再帰的定義 (但し,xは 0 以上の整数) 21
(define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) ① まず f1の適用 (中間結果を得る) ② 中間結果を使って,最終結果を得る (但し,xは 0 以上の整数) 22
もし x=0ならば 評価順 (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) x = 0 のとき 評価される部分 無視される ① x = 0 のときは trueになる 23
もし x>0ならば 評価順 (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 無視される ① x > 0 のときは falseになる 24
もし x>0ならば 評価順 (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) x>0のとき 評価される部分 ① ② 25
【0からxまでの和】 再帰的定義 「xまでの和」が,「x-1 までの和」を使って定義される.(より「簡単な場合」に帰着させるので,循環定義ではない) 【Scheme の関数定義の例】 • 関数の本体式が,自分自身の関数適用(自己参照)を含む (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 自己参照 ※ sub1は 1引く関数 26
【cond文】 1.基底ケース (base case) 再帰の終了条件を定める 2.自己参照のケース 自己参照を含む. 部分的な結果(中間結果)から,最終結果を得る (例) 中間結果: n-1 までの和. 最終結果: nまでの和 この場合,中間結果に nを足すと,最終結果が得 られる (define (f1 x) (cond [(=x0) 0] [else (+x (f1 (sub1x)))])) 自己参照 27
ラムダ式の例 (define (decn) (-n 1)) 同じ意味 (definedec (lambda(n) (-n 1)))
Scheme処理系の実演 29
Racket の起動 実演では「Advanced Student」に設定 言語 → 言語の選択 → Advanced Student → 「実行」ボタン Racket の使用準備 30 30
定義ウインドウ (Definition Window) 対話ウインドウ (Interaction Window) Enter を契機に動く Runボタンを契機に動く 定義ウインドウには エディタの機能がある ※ マウス,矢印キー,バックスペスキーなどでさかのぼって編集できる 31 31
実演1.関数定義における構文エラー (define (<関数名><パラメータ>の並び) <本体式>) <関数定義の例> 関数名 area-of-disk,パラメータ r (define (area-of-disk r) (* 3.14 (*r r))) 【関数定義の一般形】 32
構文エラーの例 かっこの数が多い 関数定義の中に, 構文エラー(Syntax Error) がある 33 33
実行ボタンを押すと・・・ 関数定義の中に構文エラーがあるので, エラーメッセージが出る 34 34
定義ウインドウは, エディタの機能がある. マウス,矢印キー, バックスペースキー などを使って,修正する 35 35
修正後は,実行ボタンを押して,関数定義を再度読み込ませる修正後は,実行ボタンを押して,関数定義を再度読み込ませる エラーメッセージが消える
実演2.関数定義における構文エラー (define (<関数名><パラメータ>の並び) <本体式>) (define (foor) (+r 100)) 【関数定義の一般形】 37
構文エラーの例 関数定義の中に, 構文エラー(Syntax Error) がある 「+」と「r」の間に 半角スペースが無い 38 38
実行ボタンを押すと・・・ 関数定義の中に構文エラーがあるので, エラーメッセージが出る 39 39
実演3. リングの面積 外径 outer、内径 innerからリングの面積を求める関数 area-of-ringを定義する 円の面積を求める関数area-of-diskを,補助関数として使う outer 真ん中に穴のあいた 円の面積と考える inner
リングの面積 リングの面積 = 外側の円の面積 - 内側の円の面積 outer 外径: outer 内径: inner inner 半径 outerの円 半径 innerの円
実演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
実演4.2次方程式 • 2次方程式 ax2 + bx + c = 0 の解を求める関数 quadratic-rootsを定義し,実行する • 2つの解を「リスト」として出力する • 重解を求める • 但し,虚数解は考えない • a = 0 の場合も考えない 出力は ・1つのリスト ・1つの数値 ・シンボル 'None のどれか quadratic-roots 入力は 3つの数値
実演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)
実行結果が,リスト,数値,シンボル で得られている
変数 x の二次方程式の一般形: • ax2 + bx + c = 0 • 二次方程式の解の数: • 係数 a,b,cの値に依存 • (1) a = 0 ⇒ 方程式は degenerate • (2) a ≠ 0 ⇒ proper な二次方程式 • もし b2 > 4ac なら 二つの解 • もし b2 = 4ac なら 一つの解 • もし b2 < 4ac なら 解無し
判別式 D = b2 - 4ac とする 1) D > 0 のとき 2) D = 0 のとき 3) D < 0 のとき 異なる2実数解 重解(解の個数は1) 解なし
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実数解