SlideShare a Scribd company logo
1 of 11
課題①アルゴリズム演習
はじめに
   アルゴリズムとは問題を解くための具体的手順、考え方
       数学でいうところの解法(定理の証明や方程式)
       コンピュータにアルゴリズムを指示するための(電子)文書を
        プログラムという
           人間より速く大量に正しい結果を導くことができるのがコン
            ピュータの強みであるが、そのためにはプログラムは正しく効率
            的なアルゴリズムに基づくことが必要である
           アルゴリズムは言語に依存しない

   アルゴリズムを構築することはもちろん大事だが、アル
    ゴリズムをプログラムソースに反映させることも大切

   今回の課題はアルゴリズムありきで、それをソースに反
    映させるやり方を学ぶ
       ついでに再帰プログラミングも
ハノイの塔
   前提
       3本の杭と、中央に穴の開いた大きさの異なる複数の円盤
        から構成される
       最初はすべての円盤が左端の杭に小さいものが上になる
        ように順に積み重ねられている



   目的
       同じ順番(小さいものが上)の状態で右端の杭にすべて
        の円盤を移す
   ルール
       一回に動かせる円盤は一番上の1枚だけ
       小さな円盤の上に大きな円盤を乗せることはできない
2つの円盤のハノイの塔

0


1



2


3
3つの円盤のハノイの塔

0                 5


1
                  6


2
                  7

3


4
再帰的な考え方
   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)に動かす場合
                 ・・・
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
課題プログラム
   勉強会のサイトからzipをダウンロード
   zipの中身
       hanoi.php ・・・ HTML出力用
       define.php・・・定数定義
       functions.php・・・関数定義 ←これを実装
       その他 js、css 等
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>";
}
画面(hanoi.php)の使い方

        枚数変更
                    手順

        自動で次々


    次の手順へ




     「次へ」や「自
    動」と連動して動
        く
おまけ
   漸化式「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 回の
    手数がかかる

More Related Content

What's hot

2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日
nukaemon
 
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式
digitalghost
 
mathemaical_notation
mathemaical_notationmathemaical_notation
mathemaical_notation
Kenta Oono
 
詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺち
do_aki
 
kagami_comput2015_7
kagami_comput2015_7kagami_comput2015_7
kagami_comput2015_7
swkagami
 
mathematical_notation
mathematical_notationmathematical_notation
mathematical_notation
Kenta Oono
 

What's hot (20)

Rの初歩: 6. グラフィックス
Rの初歩:  6. グラフィックスRの初歩:  6. グラフィックス
Rの初歩: 6. グラフィックス
 
kagamicomput201807
kagamicomput201807kagamicomput201807
kagamicomput201807
 
PCD2019 TOKYO ワークショップ「2時間で!Processingでプログラミング入門」
PCD2019 TOKYO ワークショップ「2時間で!Processingでプログラミング入門」PCD2019 TOKYO ワークショップ「2時間で!Processingでプログラミング入門」
PCD2019 TOKYO ワークショップ「2時間で!Processingでプログラミング入門」
 
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日
 
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式
 
Apg4b 2.05.再帰 sum関数の動作説明
Apg4b 2.05.再帰 sum関数の動作説明Apg4b 2.05.再帰 sum関数の動作説明
Apg4b 2.05.再帰 sum関数の動作説明
 
#6:実数と繰り返し
#6:実数と繰り返し#6:実数と繰り返し
#6:実数と繰り返し
 
表現行列の問題
表現行列の問題表現行列の問題
表現行列の問題
 
表現行列問題
表現行列問題表現行列問題
表現行列問題
 
らプラシアン作用素
らプラシアン作用素らプラシアン作用素
らプラシアン作用素
 
ラプシアン作用素
ラプシアン作用素ラプシアン作用素
ラプシアン作用素
 
mathemaical_notation
mathemaical_notationmathemaical_notation
mathemaical_notation
 
ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)ggplot2再入門(2015年バージョン)
ggplot2再入門(2015年バージョン)
 
15パズルを作ってみた
15パズルを作ってみた15パズルを作ってみた
15パズルを作ってみた
 
JOIss2015-ZDD @bekasa001
JOIss2015-ZDD @bekasa001JOIss2015-ZDD @bekasa001
JOIss2015-ZDD @bekasa001
 
詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺち
 
kagami_comput2015_7
kagami_comput2015_7kagami_comput2015_7
kagami_comput2015_7
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体
 
120919 kyushu
120919 kyushu120919 kyushu
120919 kyushu
 
mathematical_notation
mathematical_notationmathematical_notation
mathematical_notation
 

Viewers also liked

1 circuito aberto do guará de jiu jitsu - checagem - masculino - 2
1 circuito aberto do guará de jiu jitsu - checagem - masculino - 21 circuito aberto do guará de jiu jitsu - checagem - masculino - 2
1 circuito aberto do guará de jiu jitsu - checagem - masculino - 2
esporteeacaoo
 
1º checagem masculino 25.01-2013 - 1º open df de jiu-jitsu
1º checagem masculino   25.01-2013 - 1º open df de jiu-jitsu1º checagem masculino   25.01-2013 - 1º open df de jiu-jitsu
1º checagem masculino 25.01-2013 - 1º open df de jiu-jitsu
esporteeacaoo
 
PUP - The big Cleaning
PUP - The big CleaningPUP - The big Cleaning
PUP - The big Cleaning
DFC2011
 

Viewers also liked (20)

Annuals for Nebraska Landscapes - University of Nebraska
Annuals for Nebraska Landscapes - University of NebraskaAnnuals for Nebraska Landscapes - University of Nebraska
Annuals for Nebraska Landscapes - University of Nebraska
 
Are You Water Wise. Find Out - Sierra Vista Watershed, Arizona
Are You Water Wise. Find Out - Sierra Vista Watershed, ArizonaAre You Water Wise. Find Out - Sierra Vista Watershed, Arizona
Are You Water Wise. Find Out - Sierra Vista Watershed, Arizona
 
Measuring What Matters: Data Measurement for Community Managers
Measuring What Matters: Data Measurement for Community ManagersMeasuring What Matters: Data Measurement for Community Managers
Measuring What Matters: Data Measurement for Community Managers
 
Alabama Smart Yard - Alabama Master Gardeners
Alabama Smart Yard - Alabama Master GardenersAlabama Smart Yard - Alabama Master Gardeners
Alabama Smart Yard - Alabama Master Gardeners
 
An Introduction to Water Use Management and Water Efficiency Practices - New ...
An Introduction to Water Use Management and Water Efficiency Practices - New ...An Introduction to Water Use Management and Water Efficiency Practices - New ...
An Introduction to Water Use Management and Water Efficiency Practices - New ...
 
Alternative Vegetable Gardening - University of Florida
Alternative Vegetable Gardening - University of FloridaAlternative Vegetable Gardening - University of Florida
Alternative Vegetable Gardening - University of Florida
 
An introduction to using native plants in restoration projects - University o...
An introduction to using native plants in restoration projects - University o...An introduction to using native plants in restoration projects - University o...
An introduction to using native plants in restoration projects - University o...
 
Actions in the Garden and Backyard: Working with Nature - New Zealand
Actions in the Garden and Backyard: Working with Nature - New ZealandActions in the Garden and Backyard: Working with Nature - New Zealand
Actions in the Garden and Backyard: Working with Nature - New Zealand
 
Policarbonatos - Obtención
Policarbonatos - ObtenciónPolicarbonatos - Obtención
Policarbonatos - Obtención
 
Triangle fire
Triangle fireTriangle fire
Triangle fire
 
Php開発環境
Php開発環境Php開発環境
Php開発環境
 
Work and jobs
Work and jobsWork and jobs
Work and jobs
 
Portafolio 2 estrategia búsqueda
Portafolio 2 estrategia búsquedaPortafolio 2 estrategia búsqueda
Portafolio 2 estrategia búsqueda
 
1 circuito aberto do guará de jiu jitsu - checagem - masculino - 2
1 circuito aberto do guará de jiu jitsu - checagem - masculino - 21 circuito aberto do guará de jiu jitsu - checagem - masculino - 2
1 circuito aberto do guará de jiu jitsu - checagem - masculino - 2
 
www.AulasDeMatematicanoRJ.Com,Br - Matemática - Conjuntos Numéricos
 www.AulasDeMatematicanoRJ.Com,Br  - Matemática -  Conjuntos Numéricos www.AulasDeMatematicanoRJ.Com,Br  - Matemática -  Conjuntos Numéricos
www.AulasDeMatematicanoRJ.Com,Br - Matemática - Conjuntos Numéricos
 
1º checagem masculino 25.01-2013 - 1º open df de jiu-jitsu
1º checagem masculino   25.01-2013 - 1º open df de jiu-jitsu1º checagem masculino   25.01-2013 - 1º open df de jiu-jitsu
1º checagem masculino 25.01-2013 - 1º open df de jiu-jitsu
 
Edição mº 80.2 Ediçao nº 80.1 Informativo o Serrano CAPA
Edição mº 80.2 Ediçao nº 80.1 Informativo o Serrano CAPAEdição mº 80.2 Ediçao nº 80.1 Informativo o Serrano CAPA
Edição mº 80.2 Ediçao nº 80.1 Informativo o Serrano CAPA
 
PUP - The big Cleaning
PUP - The big CleaningPUP - The big Cleaning
PUP - The big Cleaning
 
Theerawut12 3 1
Theerawut12 3 1Theerawut12 3 1
Theerawut12 3 1
 
Sibrape especificações robôs
Sibrape especificações robôsSibrape especificações robôs
Sibrape especificações robôs
 

Similar to 勉強会課題①

勉強会課題①解答
勉強会課題①解答勉強会課題①解答
勉強会課題①解答
真亮 坂口
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
時響 逢坂
 
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
Hiro H.
 

Similar to 勉強会課題① (20)

勉強会課題①解答
勉強会課題①解答勉強会課題①解答
勉強会課題①解答
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
C++によるソート入門
C++によるソート入門C++によるソート入門
C++によるソート入門
 
"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6"What Does Your Code Smell Like?"で学ぶPerl6
"What Does Your Code Smell Like?"で学ぶPerl6
 
20120127 nhn
20120127 nhn20120127 nhn
20120127 nhn
 
Ekmett勉強会発表資料
Ekmett勉強会発表資料Ekmett勉強会発表資料
Ekmett勉強会発表資料
 
Pythonintro
PythonintroPythonintro
Pythonintro
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Ruby紹介3(pdf)
Ruby紹介3(pdf)Ruby紹介3(pdf)
Ruby紹介3(pdf)
 
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
モナドハンズオン前座
モナドハンズオン前座モナドハンズオン前座
モナドハンズオン前座
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」
 
Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会Java数値(浮動小数点)課題勉強会
Java数値(浮動小数点)課題勉強会
 
Material
MaterialMaterial
Material
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 

勉強会課題①

  • 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>"; }
  • 10. 画面(hanoi.php)の使い方 枚数変更 手順 自動で次々 次の手順へ 「次へ」や「自 動」と連動して動 く
  • 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 回の 手数がかかる