2006/6/27(通信コース)2006/7/5(情報コース) 住井

Slides:



Advertisements
Similar presentations
プログラミング演習B ML編 第1回 2006/6/20 (通信コース) 2006/6/28 (情報コース) 住井 ~sumii/class/proenb2006/ml1/
Advertisements

プログラミング演習( 2 組) 第 9 回
プログラミング実習 1 ・ 2 ク ラス 第 2 週目 担当教員 : 渡邊 直樹. 課題 2 ● 2 × 2型行列の固有値, 固有ベクトルを求め る EigMatrix.java というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
(Rubyistのための) 超音速:ML入門
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
プログラムのパタン演習 解説.
情報理論2 第4回 小林 学 湘南工科大学 2011年11月1日 〒 神奈川県藤沢市辻堂西海岸1-1-25
プログラミング演習(1組) 第7回
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
プログラミング基礎I(再) 山元進.
ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
多重ループ 繰り返し構造:補足事項 第8回目 [6月8日、H.16(‘04)] 本日のメニュー 1)前回の課題について
多重ループ 繰り返し構造:補足事項 第8回目 [6月12日、H.15(‘03)] 本日のメニュー 1)前回の課題について
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
2006/11/02 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
条件式 (Conditional Expressions)
~sumii/class/proenb2010/ml4/
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
2007/6/5(通信コース)2007/6/6(情報コース) 住井
~sumii/class/proenb2010/ml1/
第10回関数 Ⅱ (ローカル変数とスコープ).
プログラミング入門 電卓を作ろう・パートIV!!.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
前回の練習問題.
~sumii/class/proenb2009/ml1/
第9回関数Ⅰ (簡単な関数の定義と利用) 戻り値.
知能情報工学演習I 第8回( C言語第2回) 課題の回答
ソフトウェア制作論 平成30年9月26日.
第7回課題 フィボナッチ数列 (コード:p.171) について,fib(4) を呼び出したときの起こる出来事は以下の通りである.
情報処理Ⅱ 第2回:2003年10月14日(火).
11.再帰と繰り返しの回数.
演習07-0 “Hello\n” “World!\n”と
C言語 はじめに 2016年 吉田研究室.
2007/6/12(通信コース)2007/6/13(情報コース) 住井
補講:アルゴリズムと漸近的評価.
基礎プログラミング演習 第6回.
第6回レポート解説 条件1 条件2 条件3 月の入力 月、日、曜日の表示 日の入力 曜日の入力
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
ウェブデザイン演習 第6回.
~sumii/class/proenb2010/ml2/
~sumii/class/proenb2009/ml4/
第5回 プログラミングⅡ 第5回
2006/7/18(通信コース)2006/7/26(情報コース) 住井
2008/7/16(情報コース)2008/7/22(通信コース) 住井
~sumii/class/proenb2009/ml6/
地域情報学 C言語プログラミング 第3回 入力、if文、for文 2016年11月25日
関数型言語の基礎 型なしl計算 型理論 構成的プログラミング GUIにあらわれる関数概念 PBD VL
~sumii/class/proenb2010/ml5/
コンパイラ 2012年10月11日
演習00-0 “Hello\n” “World!\n”と
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
地域情報学 C言語プログラミング 第3回 入力、if文、for文 2017年11月1日
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
2007/6/26(通信コース)2007/6/27(情報コース) 住井
Presentation transcript:

2006/6/27(通信コース)2006/7/5(情報コース) 住井 プログラミング演習B ML編 第2回 2006/6/27(通信コース)2006/7/5(情報コース) 住井 http://www.kb.ecei.tohoku.ac.jp/ ~sumii/class/proenb2006/ml2/

今日のポイント 変数定義 val 変数名 = 式 関数定義 fun 関数名 引数名1 … 引数名n = 式 単一代入と静的スコープ 再帰関数

レポートについて 課題の解答を ml-enshu@kb.ecei.tohoku.ac.jp にメールせよ。件名(Subject)は必ず kadai2:A1TB2345:東北太郎 の形にすること(氏名以外半角)。 締め切りは一週間後の午前8時50分厳守。 質問は上述のアドレスにメールせよ。 レポートの不正は試験の不正と同様に処置する。 第何回の課題か(一桁の数字) 自分の学籍番号 自分の氏名

ポイント1:変数定義 プログラムに繰り返し出てくる 「同じ式」を一つにまとめたい ⇒「変数」を定義する 例題: 半径1.2の円の周の長さを求めよ。 直径3.4の円の周の長さを求めよ。 半径5.6の円の面積を求めよ。 ただし円周率は3.14159265359とする。

変数を定義しないと… - 2.0 * 3.14159265359 * 1.2 ; val it = 7.53982236862 : real - 3.14159265359 * 3.4 ; val it = 10.6814150222 : real - 3.14159265359 * 5.6 * 5.6 ; val it = 98.5203456166 : real

変数を定義すれば… - val pi = 3.14159265359 ; val pi = 3.14159265359 : real val it = 7.53982236862 : real - pi * 3.4 ; val it = 10.6814150222 : real - pi * 5.6 * 5.6 ; val it = 98.5203456166 : real

変数定義の構文 val 変数名 = 式 「変数名」は英文字で始まり、英数字または_(下線)または'(アポストロフィ)が続く 大文字も小文字も使用できるが区別される 実は!#$%など記号列も良いが本演習では使わない

今まで式;と入力していたのは、 実はval it = 式;の省略 ちなみに… 今まで式;と入力していたのは、 実はval it = 式;の省略 - 2 ; val it = 2 : int - it * 2; val it = 4 : int val it = 8 : int val it = 16 : int

課題2. 1 現在の円ドル為替レートを調べ、 「1ドル=何円か」を表す変数 rateを定義して、次の計算をせよ。 123.45ドルは何円か。 6789円は何ドル何セントか。 買いレートと売りレートの差など、 細かいことは気にしなくて良い。

繰り返し出てくる「同じ形の式」を一つにまとめたい ポイント2:関数定義 繰り返し出てくる「同じ形の式」を一つにまとめたい ⇒「関数」を定義する 例題: 半径1.2の円の面積を求めよ。 半径3.45の円の面積を求めよ。 半径6.789の円の面積を求めよ。

関数を定義すれば簡単 - val pi = 3.14159265359 ; val pi = 3.14159265359 : real - fun area r = pi * r * r ; val area = fn : real -> real - area 1.2 ; val it = 4.52389342117 : real - area 3.45 ; val it = 37.3928065594 : real - area 6.789 ; val it = 144.797642174 : real

関数定義の構文 fun 関数名 引数名1 … 引数名n = 式 改行はどこに入れても良いが、 =の後に入れるのが普通 関数名・引数名に使える文字列は 変数名と同じ

関数適用の構文 関数 引数1 … 引数n 関数と引数を並べて書くだけ 関数に引数を与えて呼び出すことを、「関数を引数に適用する」という 注:関数適用の優先順位は二項演算より高い 例:f 3 + g 4は(f 3)+(g 4)と同じ 関数に引数を与えて呼び出すことを、「関数を引数に適用する」という 「引数を関数に適用する」とは言わないので気をつける

課題2. 2 次の関数を定義し、 それらを適用した例を挙げよ。 整数iを受け取って、 i+1を返す関数succ 整数iを受け取って、 i*iを返す関数square 浮動小数xを受け取って、 x/2.0を返す関数half

課題2. 3 課題2. 1で定義した変数rateを用いて、次の関数を定義せよ。 円をドルに換算する関数 ドルを円に換算する関数

課題2. 4 浮動小数xとyを受け取って、座標平面における原点から点(x, y)までの距離を返す関数distanceを定義せよ。 平方根を計算する関数Math.sqrtは あらかじめ定義されているので用いて良い。 ヒント:次のようになれば良い。 - distance 3.0 4.0 ; val it = 5.0 : real

ポイント3 下の式の評価結果はいくつになるか? - val pi = 3.14 ; val pi = 3.14 : real - fun area r = r * r * pi ; val area = fn : real -> real - val pi = 3.0 ; val pi = 3.0 : real - area 10.0 ; val it = ????? : real

なんでそうなるの? Cなどの命令型言語と異なり、関数型言語MLでは変数の値が定義の後で変化することはない(単一代入)。 たとえ同じ名前を定義しても、それは新しい変数の定義であって、それより前の定義には影響しない(静的スコープ)。

ポイント4:再帰関数 例題: 正の整数nを受け取って、 1からnまでの整数の総和を返す関数sumを定義せよ。

考え方のコツ nについての場合分けと帰納法 nが1の場合: 1を返す nが1より大きい場合: 1からn-1までの総和である sum(n-1)を求め、 それにnを足して返す

できたプログラム - fun sum n = = if n = 1 then 1 else = sum (n - 1) + n ; val sum = fn : int -> int - sum 10 ; val it = 55 : int ただし「if 式1 then 式2 else 式3」は 「式1の値がtrueならば式2の値を、  falseならば式3の値を返す」という式

課題2. 5 非負整数nを受け取り、フィボナッチ数列の第n項を計算する関数fibを、次の考え方に基づいて定義せよ。 nが1以下ならばnを返す そうでなければ、第n-1項であるfib(n-1)と、第n-2項であるfib(n-2)との和を返す

課題2. 6 浮動小数xと非負整数nを受け取り、xのn乗を返す関数powerを、次の考え方に基づいて定義せよ。 nが0ならば1.0を返す そうでなければ、xのn-1乗であるpower x (n-1)を求め、それにxを掛けて返す

課題2. 7 二つの非負整数mとnを受け取り、mとnの最大公約数を返す関数gcdを、次の考え方に基づいて定義せよ。 mが0ならばnを返す そうでなければ、もしmがn以下だったら、mとn-mの最大公約数であるgcd m (n-m)を返す そうでなければ、nとm-nの最大公約数であるgcd n (m-n)を返す

※ optional: やらなくても良いが、出来たらボーナス点 アッカーマン関数とは、どのような関数か。検索などで調べて述べよ。 SMLでアッカーマン関数を定義し、関数の特徴を実際に確認せよ。

※ optional: やらなくても良いが、出来たらボーナス点 nが偶数の場合は  xのn乗 =(x*x)の(n div 2)乗 であることを利用して、課題2. 6の関数powerを「大幅に」高速にせよ(power 0.1 1000000000が一瞬で計算できるぐらい)。 高速化後のpowerを呼び出すごとに、浮動小数の掛け算は何回ぐらい計算されるか。nの関数(MLの関数ではなく数学の関数)として大まかに表せ。 1.と同様の関数を、C言語ないしJava言語で、再帰ではなくループを用いて書け。