20070627フレッシュマンセミナー
TRANSCRIPT
どんな時代?• 国産パソコン NEC PC-9801
• PC-9801VX01(1987年):CPU 8MHz, HDDなし(FDのみ), 353,000円(今だと50万円以上?)
• Windows なんぞ当然なし
• Sun3/60(研究室にあったコンピュータ)
• CPU 20MHz, メモリ24MB, 数百万円
今にして思えば
• 情報工学の二面性• 計算機科学:コンピュータの構成に関する学問…物理現象が関わる
• 情報科学:コンピュータ上で問題を解く学問…計算手順、アルゴリズム
• これらは互いに関連している
コンピュータは万能?
• プログラムが書ければええやん→否• コンピュータでは時間がかかりすぎて(事実上)解けない問題もある
• コンピュータがもっと速くなったら解けるか?→Yesの場合もNoの場合もある
答は• 組み合わせの総数• 230 = 10億7374万1824 回
• 1073741824 / (60 × 24 × 365) ≒ 2037 (年)
• 理論上は無限ではないから調べられるが、現実的には調べられない
すると• 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) {/* 以下省略 */
}
法則がそのままプログラムになる
問題ウサギの対は生まれて1ヶ月経つと1対(2
匹 )の子供を産むようになり、それ以降は毎日子を1対産む。またこのウサギは決して死なない。
1対のウサギが最初にいたとして、1年後には何対のウサギがいることになるか。
考え方• nヶ月目のウサギの対は
• n-1ヶ月目までのウサギの対
• n-2ヶ月目までに生まれていたウサギが産んだ子供
• nヶ月目の対の数をF(n)とすると
• F(n) = F(n-1) + F(n-2), F(0) = 1, F(1) = 2
• これに従って計算すると F(12) = 377
実は
• 有名な数列(フィボナッチ数列)
• 一般項は複雑• しかしプログラムは漸化式そのもの
int F(int n){
if (n == 0) return 1; else if (n == 1) return 2;
else {return F(n-1)+F(n-2);
}}
F (n) =1⇥5
⇤�1 +
⇥5
2
⇥n
+
�1 −
⇥5
2
⇥n⌅
問題台の上に3本の棒A, B, Cがあり、Aにn枚の円盤がはまっている。円盤は下ほど半径が大きい。次のルールを満たしながら、円盤をすべてBに移すのに必要な手数をnで表せ。(ハノイの塔)
• 一度に一枚の円盤しか移動できない• 途中で円盤の大小を逆にしてはいけない
問題川岸に、狼、山羊、キャベツをつれた人がいる。川には船が一艘あるが、一度にたかだか一つの荷物しか運べない。また、狼と山羊(山羊とキャベツ)だけを川岸に置いたまま人が離れると、狼(山羊)が山羊(キャベツ)を食べてしまう。このとき、すべての荷物を反対側の岸に運ぶ最短手順を求めよ。
書き方を決める• 左岸にいるもの-右岸にいるもの
• 人(P)、狼(W)、山羊(G)、キャベツ(C)、何もいない(Φ)
• 例:最初は PWGC-Φ
• 目標:PWGC-Φ から Φ-PWGC に至る最短経路を示すこと
図にしてみるとPWGC-Φ WC-PG PWC-G
W-PGCC-PWG
WGP-CPGC-W
G-PWCPG-WCΦ-PWGC
G Φ
G Φ
G Φ
ΦG
C
CWW
GGGG
WWC
C
枝のラベル:Pが対岸に運んだもの
よくある会話学生:「先生、このプログラムの課題、分からないんですけど」
私:「アルゴリズムは分かるの?」
学生:「それは何となく分かります」
私:「そんなら、そのままプログラムにすればええやん」
学生:「どうやってプログラムにしたらいいかが分からないんです」
Algorithm = Program?
• 否• Algorithm + Data Structure = Program
(by N. Wirth)
• プログラムには両方重要• アルゴリズム(計算手順)• それに適したデータ構造(変数、配列、構造体etc.)…高校数学やパズルにはまったくなかった部分
鍵はデータ構造• 計算の局面をどう表すか• アルゴリズムの世界では…比較的自由
• 線形リスト、スタック、待ち行列、木、二分木、配列、集合、…
• プログラムの世界では…単純、限定
• Cだと:変数、配列、構造体、…
• データ構造をいかに翻訳するかが鍵
問題天国と地獄の分かれ道に2人の人がいる。彼らはチャーチルとヒットラーであるが、どちらがどちらかは分からない。チャーチルは、質問には必ず本当のことを答える。ヒットラーは必ず本当と反対のことを答える。1回だけ質問をして、天国への道を見分ける方法を考えよ。