20090616 フレッシュマンセミナー

Post on 15-Feb-2017

14 Views

Category:

Education

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

フレッシュマンセミナー国島丈生(t.kunishi@gmail.com)

2009-06-17

経歴

1985-1994 1994-1997 1997-2009

担当講義

情報通信工学実験1B(2年)

プログラミング言語Ⅱ(2年)

コンパイラ(3年)

プログラミング言語Ⅲ(3年)

形式言語理論(修士1年)

ソフトに興味あり

データベース

テキスト処理、文書(XML)処理

プログラミング言語

Web技術

オートマトン理論

KUNISHI ON BOOKS

KUNISHI ON THE WEB

今日の内容

高校・大学時代の体験談

高校数学から情報科学へ

そしてプログラミングへ

高校・大学時代の 体験談

高校時代は

コンピュータとは無縁

数学が好き

物理・化学は… (>_<)

英語や国語の方が得意だったかも

パソコンは高嶺の花 NEC PC-9801VX01 (1987年)

CPU 8MHz

HDDなし(FDのみ)

Windows なし

353,000円(今だと50万円以上?)

関数電卓?

ポケットコンピュータ(ポケコン)

メモリ2~16KB

ディスクなし

BASICのプログラムが動いた

INTERNET 黎明期

1984 東大、東工大、慶応大

1988 大学・企業の研究所間

1992以降 個人へ普及

1990年代 携帯電話登場

大学選びは安直…

数学を生かしたい→当時の京大では選択肢3つ

理学部数学科:就職に困るらしい…

工学部数理工学科, 工学部情報工学科

パンフを読んでも違いが分からん!!→偏差値で情報工学科を選択

コンピュータはあまり意識せず

1985年 京都大学工学部情報工学科入学

誤 算

誤算その1

物理が結構必要だった…

誤算その2

大学の数学は難しかった…

誤算その3

専門では微積分はあまり使わなかった

「独特」の理論

ブール代数etc.

パズルに近い

結果オーライ?

もともとパズルは好き

数学よりプログラムの方が合っていたらしい

卒論でやったこと

C, C++で1,500行程度のプログラミング

念のため

プログラミングの達人では決してない

同期にももっと凄いのがいた

皆さんの中の凄腕プログラマのほうが実力は私より上のはず

高校数学から 情報工学へ

情報工学の二面性

ハードウェアを作る

ソフトウェアを作る

物理 連続系の数学

離散系の数学

連続系 VS 離散系

連続した数 (実数)

連続しない数 (整数, 0/1 etc.)

微分・積分

集合 剰余系 場合の数 数列

数学的帰納法

物理現象

情報数学

情報科学への橋渡し

ケーニヒスベルクの橋

図の7つの橋を各1度ずつ通って元の場所に戻ってくることができるか。ただし、同じ橋を2度以上通ってはならない。

関連:グラフ理論

ハノイの塔

台の上に3本の棒A, B, Cがあり、Aに n 枚の円盤がはまっている。円盤は下ほど半径が大きい。次のルールを満たしながら、円盤をすべてBに移すのに必要な手数を n で表せ。

一度に一枚の円盤しか移動できない

途中で円盤の大小を逆にしてはいけない

関連:再帰

そして プログラミングへ

誰だって難しい

まず敵(味方?)を知る

コンピュータは

複雑な処理は苦手

単純な処理の繰り返しが得意

中間結果をたくさん覚えても平気

例:定積分

人間は不定積分から計算

⇤ 1

0

x2dx =�13x3

⇥1

0

=13

例:定積分

コンピュータは不定積分のような式変形は苦手

区分求積法

n = 1000 で 0.3338335

⌃ 1

0

x2dx ⇥n⇧

k=1

⇤�k

n

⇥2

· 1n

⌅=

1n3

n⇧

k=1

k2

プログラムの例

S = 0;for (k = 1; k <= n; k ++) { S = S + k * k;}S = S / (n * n * n);

⌃ 1

0

x2dx ⇥n⇧

k=1

⇤�k

n

⇥2

· 1n

⌅=

1n3

n⇧

k=1

k2

フィボナッチ数列

F0 = 1, F1 = 1, Fn+2 = Fn+1 + Fn

1, 1, 2, 3, 5, 8, 13, 21, 34, …だが一般項は複雑

Fn =1⇥5

⇤�1 +

⇥5

2

⇥n

+

�1 −

⇥5

2

⇥n⌅

プログラム=漸化式

int F(int n) {

if (n == 0) return 1; else if (n == 1) return 1; else {

return F(n-1)+F(n-2); }

}

F0 = 1, F1 = 1, Fn+2 = Fn+1 + Fn

法則を見つける

今日は日曜日です。100日後は何曜日?

1日後は月、2日後は火、…100日後は火

法則を見つけよ

今日は日曜日。1億日後は何曜日?

とても数えられません

7の倍数日後はいつも日曜日。 1億÷7 = 14285714 あまり 2。∴火曜日

法則を見つけよ

今日は日曜日。10100日後は何曜日?

10100なんて計算できない

10100を7で割った余りも計算できない

10nを7で割った余りを、n=1, 2, …で計算してみよう

すると

100 % 7 = 1, 101 % 7 = 3, 102 % 7 = 2, 103 % 7 = 6, 104 % 7 = 4, 105 % 7 = 5, 106 % 7 = 1, 107 % 7 = 3, …

%:剰余を表す演算子

周期6で同じ数が出る(1, 3, 2, 6, 4, 5)

100 % 6 = 4 ∴木曜日

プログラムにすると

void nannyoubi(int n) { if (n%6 == 0) { printf(“月曜日¥n”); } else if (n%6 == 1) { printf(“水曜日¥n”); } else if (n%6 ==2) { /* 以下省略 */ }

経験に基づく プログラミング学習の

アドバイス

プログラミング学習は

語学学習に似ている

人の真似は大事

インプットがなければアウトプットはできない

まずは他人のコードの真似から

人のコードを読んで引出しを増やせ

Cと相性が悪くても

世の中には無数にプログラミング言語がある

プログラミングの根は共通

一つ言語をマスターすれば、他の言語に応用が利く

本を読もう

経験に基づく仮説

国語力のある人はプログラミング能力も高い

プログラム=(プログラミング言語という)言語で書かれた文章

文章に触れる機会を増やしてください(ジャンルは問いません)

諸君の健闘を祈る

レポート課題

以下の2点についてA4用紙1枚程度にまとめ、6/23(火)17:00までに提出せよ。(提出場所:2610室)

ケーニヒスベルクの橋、もしくはハノイの塔(解に至る経過も含めて)

今日の講義の感想

top related