勉強会課題①
- 2. はじめに
アルゴリズムとは問題を解くための具体的手順、考え方
数学でいうところの解法(定理の証明や方程式)
コンピュータにアルゴリズムを指示するための(電子)文書を
プログラムという
人間より速く大量に正しい結果を導くことができるのがコン
ピュータの強みであるが、そのためにはプログラムは正しく効率
的なアルゴリズムに基づくことが必要である
アルゴリズムは言語に依存しない
アルゴリズムを構築することはもちろん大事だが、アル
ゴリズムをプログラムソースに反映させることも大切
今回の課題はアルゴリズムありきで、それをソースに反
映させるやり方を学ぶ
ついでに再帰プログラミングも
- 3. ハノイの塔
前提
3本の杭と、中央に穴の開いた大きさの異なる複数の円盤
から構成される
最初はすべての円盤が左端の杭に小さいものが上になる
ように順に積み重ねられている
目的
同じ順番(小さいものが上)の状態で右端の杭にすべて
の円盤を移す
ルール
一回に動かせる円盤は一番上の1枚だけ
小さな円盤の上に大きな円盤を乗せることはできない
- 6. 再帰的な考え方
n枚の円盤を(A) から(B)に動かす場合、
1. 一番大きい円盤を除いたn-1枚を(A)から(C)に移動
2. 一番大きい円盤を(A)から(B)に移動
3. 一番大きい円盤を除いたn-1枚を(C)から(B)に移動
n-1枚の円盤を(A) から(C)に動かす場合
1. 一番大きい円盤を除いたn-2枚を(A)から(B)に移動
2. 一番大きい円盤を(A)から(C)に移動
3. 一番大きい円盤を除いたn-2枚を(B)から(C)に移動
n-2枚の円盤を(A) から(B)に動かす場合
1. 一番大きい円盤を除いたn-3枚を(A)から(C)に移動
2. 一番大きい円盤を(A)から(B)に移動
3. 一番大きい円盤を除いたn-3枚を(C)から(B)に移動
n-2枚の円盤を(A) から(B)に動かす場合
・・・
- 7. 0
n-1枚(n>1)
・
・
・
S(n-1)
・
・
・
S(n-1)+1
・
・
・
S(n-1)+1+S(n-1)
=2*S(n-1)+1 S(n) = 2*S(n-1) + 1 ・
または ・
・
S(n+1) = 2*S(n) + 1
- 8. 課題プログラム
勉強会のサイトからzipをダウンロード
zipの中身
hanoi.php ・・・ HTML出力用
define.php・・・定数定義
functions.php・・・関数定義 ←これを実装
その他 js、css 等
- 9. functions.php
<?php
/**
* $num枚の円盤を$fromから$toに移動する
*
ここを埋める
* @param integer $num
* @param string $from
・hanoi.phpから呼び出される
* @param string $to ※move($num, ‘左’, ‘右’);
※$numは円盤の枚数
*/
function move($num, $from, $to)
{
・ここ以外は変更不可
・10行未満で書く
}
・呼び出す関数はmove、getRest、printTextの
/**
* $from, $to に指定されていない柱の名前を返す
み
* ex) $from='左', $to='右'の場合"中央"を返す ※getRest、printTextは1ヶ所だけ
*
* @param string $from
* @param string $to
* @return string
*/
function getRest($from, $to)
{
return array_pop(array_diff(array('左', '中央', '右'), array($from, $to)));
}
/**
* 出力用関数
*
* @param string $from
* @param string $to
*/
function printText($from, $to)
{
echo "<li type=1>{$from}から{$to}</li>";
}
- 11. おまけ
漸化式「S(n+1)=2*S(n)+1」 の一般項を求めよ
一般項を推定する
S(1)=1, S(2)=3, S(3)=7, S(4)=15, ・・・
1を足すと 2,4,8,16 ・・・ 2の累乗数になっている → S(n) = 2n-1
推定した一般項から漸化式の成立を証明する
S (n)=2n-1
S(n+1)=2n+1-1
=2*2n-1
=2*(S(n)+1)-1
=2*S(n)+2-1
=2*S(n)+1
n枚の円盤すべてを移動させるには最低 2n – 1 回の
手数がかかる