- 日時 :2006/5/21 (Mon) - 場所 :名大 理学部1号館(多元数理科学研究科) 307室 - 時刻 :18:00〜19:30 - 参加者:13名 - Garrigue先生がキタ - ocamlで[[不動点コンビネータ]]って書けるんでしたっけ?型はどうなるんでせう?Haskellなら y f = f (y f) ですが -- [[けいご]] &new{2006-05-23 (火) 10:53:09}; - let rec y f = f (y f);;です。再帰を使って不動点を定義するという妙なことになりますが、この際気にしない :) -- [[小笠原]] &new{2006-05-23 (火) 10:57:31}; - あっ、lazy 忘れてました。let rec y f = f (lazy (y f));; こうしないとスタック溢れます。すみません。 -- [[小笠原]] &new{2006-05-23 (火) 11:21:17}; - おおっなるほど〜 しかし[[別の所:http://tsukimi.agusa.i.is.nagoya-u.ac.jp:16080/~sydney/ocaml/index.php?%C9%D4%C6%B0%C5%C0%A5%B3%A5%F3%A5%D3%A5%CD%A1%BC%A5%BF#lc835d08]]ではまってしまいました。 -- [[けいご]] &new{2006-05-23 (火) 11:33:57}; - おおっなるほど〜 しかし[[別の所:http://www.itpl.co.jp/ocaml-nagoya/index.php?%C9%D4%C6%B0%C5%C0%A5%B3%A5%F3%A5%D3%A5%CD%A1%BC%A5%BF#lc835d08]]ではまってしまいました。 -- [[けいご]] &new{2006-05-23 (火) 11:33:57}; *3章 exercise [#sa623689] ** exercise3 (吉岡) [#jd1bac1a] #2実数の相乗平均をとる関数geo_meanを定義せよ。 let geo_mean (x,y)=sqrt(x*.y);; ** exercise4 (飯田) [#yad7172f] #2行2列の実数行列と2要素の実数ベクトルの積をとる関数 let prodMatVec ((a,b),(c,d)) (x,y) = ((a*.x+.b*.y),(c*.x+.d*.y));; ** exercise5 (みずの) [#e108fb3e] (* 作り方 *) # (0.1,0.2,0.3,0.4);; - : float * float * float * float = (0.1, 0.2, 0.3, 0.4) # ((0.1,0.2),(0.3,0.4));; - : (float * float) * (float * float) = ((0.1, 0.2), (0.3, 0.4)) (* 取り出す *) # let (x,_,_,_) = (0.1,0.2,0.3,0.4);; val x : float = 0.1 # (fst (fst ((0.1,0.2),(0.3,0.4))));; - : float = 0.1 ** exercise7 (小笠原) [#jd1bac1a] #再帰関数の練習 #不動点コンビネーターを使ってもいいけど、それはまたの機会に let rec pow (x, n) = if n = 0 then 1.0 else x *. pow (x, n - 1) ;; let rec pow' (x, n) = match n with 0 -> 1.0 | n when n mod 2 = 0 -> pow' (x *. x, n / 2) | n -> x *. pow' (x, n - 1) ;; ** Exercise9 (山本) [#p242ccb6] 添付ファイルを参照... **Excercise10 (樋口) [#t21730ae] fib 4 -> if 4 =1 || 4 = 2 then 1 else fib(4-1)+fib(4-2) -> fib(3) + fib(2) -> (if 3 =1 || 3 = 2 then 1 else fib(3-1)+fib(3-2)) + fib(2) -> ( fib(2) + fib(1) ) + fib(2) -> ( (if 2 = 1 || 2=2 then 1 else fib(2-1)+fib(2-2)) + fib(1) ) + fib(2) -> (1 + fib(1) ) + fib(2) -> (1 + (if 1 = 1 || 1 = 2 then 1 else fib(1-1)+fib(1-2)) ) + fib(2) -> (1+1) + fib(2) -> 2 + fib(2) -> 2 + (if 2 = 1 || 2 = 2 then 1 else fib(2-1)+fib(2-2)) -> 2 + 1 -> 3 ** exercise11 (けいご) [#k0e4344a] # Exercise 11 担当:今井(け) # 1. let rec gcd m = function 0 -> m | n -> gcd n (m mod n) ;; # 落とし穴 # let gcd m = function 0 -> 0;; # などと遊んだ後, # let gcd m = function # 0 -> m # | n -> gcd n (m mod n) # ;; # と,recが欠けた定義をしたら,おかしなことになった # 2. # nCr = n!/r!(n-r)! let rec comb n r = let rec fac = function 0 -> 1 | n -> n * fac (n-1) in fac n / ((fac r) * (fac (n-r))) ;; # 3. # let rec fib_iter n (prev, curr) = if n = 1 then curr else fib_iter (n-1) (curr, prev+curr);; val fib_iter : int -> int * int -> int = <fun> # let fib n = fib_iter n (0, 1);; val fib : int -> int = <fun> # fib 1;; - : int = 1 # fib 2;; - : int = 1 # fib 3;; - : int = 2 # fib 4;; - : int = 3 # fib 5;; - : int = 5 # fib 6;; - : int = 8 # 4. はやってない **Exercise 12 (末次) [#p15a88be] let rec pos n = if n < 0 then 0.0 else pos (n - 1) +. 1.0 /. (float_of_int (4 * n + 1)) -. 1.0 /. (float_of_int (4 * n + 3));;