• 検索結果がありません。

ハノイの塔ハノイの塔ハノイの塔ハノイの塔

N/A
N/A
Protected

Academic year: 2021

シェア "ハノイの塔ハノイの塔ハノイの塔ハノイの塔"

Copied!
93
0
0

読み込み中.... (全文を見る)

全文

(1)

アルゴリズムとデータ構造 補足資料 9-1

「ハノイの塔」

横浜国立大学

理工学部

数物・電子情報系学科

富井尚志

(2)

ハノイの塔

(3)

ハノイの塔

• 条件1:一度に一枚の円盤だけが移動で きる。

• 条件2:どの円盤もその円盤より小さい 円盤の上においてはいけない。

• 条件3:棒Cを補助的な場所として良い

(4)

ハノイの塔:実際にやってみよう

(準備)

• A4の紙を配ります。

(裏紙:再利用紙です。裏側の白い面を使いま す。)

• まず、半分に切ってください。

– できた 2 枚のうち、一枚をまた半分に切ってください。

できた

2

枚のうち、一枚をまた半分に切ってください。

できた

2

枚のうち、一枚をまた半分に切ってください。

»

できた

2

枚のうち、一枚をまた半分に切ってください。

» 5

回くらいでいいです。。。

»

これも再帰的。。。

(5)

半分に切 る

ハノイの塔:実際にやってみよう

(準備)

(6)

ハノイの塔:実際にやってみよう

(準備)

(7)

ハノイの塔:実際にやってみよう

(準備)

これは使いません。→

番号をかいて、

四隅にしるしをつけよう。

(奇数のカードの四隅には 、偶数のカードの四隅には

● ×

5

3

1

・ ・

4

・ ・

× ×

×

×

2

× ×

×

×

(8)

ハノイの塔:実際にやってみよう

(準備)

順番に重ねる。

5

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

(9)

ハノイの塔:実際にやってみよう

(準備)

順番に重ねる。

(四隅のしるしが見えるように)

5

4

× ×

×

×

3

2

× ×

×

×

1

・ ・

・ ・

(10)

棒(領域)A

ハノイの塔:実際にやってみよう

(準備)

円盤→カード 棒→領域

5

4

× ×

×

×

3

2

× ×

×

×

1

・ ・

・ ・

棒(領域) B 棒(領域) C

(11)

棒(領域)A

ハノイの塔:実際にやってみよう

(準備)

• 一度に、一番上の 1 枚だけ移動できる

• どのカードも、そのカードより小さいカードの 上においてはいけない

• 領域 C を補助的な場所として使用してよい

最終的に、カードの束を、領域Aから領域Bに移動させる

5

4

× ×

×

×

3

2

× ×

×

×

1

・ ・

・ ・

棒(領域) B 棒(領域) C

スタート

(12)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:実際にやってみよう

(準備)

• 一度に、一番上の 1 枚だけ移動できる

• どのカードも、そのカードより小さいカードの 上においてはいけない

• 領域 C を補助的な場所として使用してよい

最終的に、カードの束を、領域Aから領域Bに移動させる

5

4

× ×

×

×

3

2

× ×

×

×

1

・ ・

・ ・

ゴール

(13)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:実際にやってみよう

(まずは 2 枚から)

• 一度に、一番上の 1 枚だけ移動できる

• どのカードも、そのカードより小さいカードの 上においてはいけない

• 領域 C を補助的な場所として使用してよい

最終的に、カードの束を、領域Aから領域Bに移動させる

2

× ×

×

× 1

・ ・

・ ・

(14)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:実際にやってみよう

(まずは 2 枚から)

• 一度に、一番上の 1 枚だけ移動できる

• どのカードも、そのカードより小さいカードの 上においてはいけない

• 領域 C を補助的な場所として使用してよい

最終的に、カードの束を、領域Aから領域Bに移動させる

2

× ×

×

×

1

・ ・

・ ・

スタート

(15)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:実際にやってみよう

(まずは 2 枚から)

• 一度に、一番上の 1 枚だけ移動できる

• どのカードも、そのカードより小さいカードの 上においてはいけない

• 領域 C を補助的な場所として使用してよい

最終的に、カードの束を、領域Aから領域Bに移動させる

2

× ×

×

×

1

・ ・

・ ・

A

から

C

へ 移動

2

B

に移動させ るにまず、

その上の

1

C

に移動させる

(16)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:実際にやってみよう

(まずは 2 枚から)

• 一度に、一番上の 1 枚だけ移動できる

• どのカードも、そのカードより小さいカードの 上においてはいけない

• 領域 C を補助的な場所として使用してよい

最終的に、カードの束を、領域Aから領域Bに移動させる

2

× ×

×

×

1

・ ・

・ ・

A

から

B

へ 移動

一番下の

2

B

に移動させた

(17)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:実際にやってみよう

(まずは 2 枚から)

• 一度に、一番上の 1 枚だけ移動できる

• どのカードも、そのカードより小さいカードの 上においてはいけない

• 領域 C を補助的な場所として使用してよい

最終的に、カードの束を、領域Aから領域Bに移動させる

2

× ×

×

×

1

・ ・

・ ・

C

から

A

へ 移動

C

に退避して いた

1

B

に移動させた

ゴール!

(18)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:実際にやってみよう

(つぎは 3 枚)

3

2

× ×

×

× 1

・ ・

・ ・

実際にやってみよう

(19)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:実際にやってみよう

実際にやってみよう ゴールが B か C かは

あまり気にせず、 4 枚、 5 枚、、、

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

(20)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:解き方

この水色の山を B に動かすには

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

(21)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:解き方

この水色の山を B に動かすには、

まずその上の紫を

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

(22)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:解き方

この水色の山を B に動かすには、

まずその上の紫を C に「移動」して

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

(23)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:解き方

この水色の山を B に動かすには、

まずその上の紫を C に「移動」して 一番下を B に動かし

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

(24)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:解き方

この水色の山を B に動かすには、

まずその上の紫を C に「移動」して 一番下を B に動かし

C に退避した部分を B に「移動」

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

(25)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:プログラム

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

この水色の山を B に動かすには

hanoi( 4, “ 棒 A”, “ 棒 B”, “ 棒 C”)

(26)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:プログラム

この水色の山を B に動かすには、

まずその上の紫を

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

hanoi( 3, “ 棒 A”, “ 棒 C”, “ 棒 B”)

(27)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:プログラム

この水色の山を B に動かすには、

まずその上の紫を C に「移動」して

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

hanoi( 3, “ 棒 A”, “ 棒 C”, “ 棒 B”);

(28)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:プログラム

この水色の山を B に動かすには、

まずその上の紫を C に「移動」して 一番下を B に動かし

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

hanoi( 3, “ 棒 A”, “ 棒 C”, “ 棒 B”);

move(“ 棒 A”, “ 棒 B”);

(29)

棒(領域)A 棒(領域) B 棒(領域) C

ハノイの塔:プログラム

この水色の山を B に動かすには、

まずその上の紫を C に「移動」して 一番下を B に動かし

C に退避した部分を B に「移動」

4

× ×

×

×

3

2

× ×

×

× 1

・ ・

・ ・

hanoi( 3, “ 棒 A”, “ 棒 C”, “ 棒 B”);

move(“ 棒 A”, “ 棒 B”);

hanoi(3, “ 棒 C”, “ 棒 B”, “ 棒 A”);

(30)

ハノイの塔:プログラム

void hanoi(int ndisk, char *src, char *dst, char *work) {

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

}

(31)

おっと、その前に

ゴミは必ず、各自持ち帰ってください。

(32)

ハノイの塔:プログラム

void hanoi(int ndisk, char *src, char *dst, char *work) {

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

} }

src : “ 棒 A” dst: “ 棒 B” work: “ 棒 C”

ndisk

(33)

ハノイの塔:プログラム

void hanoi(int ndisk, char *src, char *dst, char *work) {

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

} }

src : “ 棒 A” dst: “ 棒 B” work: “ 棒 C”

ndisk

ndisk-1

(34)

ハノイの塔:プログラム

void hanoi(int ndisk, char *src, char *dst, char *work) {

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

} }

src : “ 棒 A” dst: “ 棒 B” work: “ 棒 C”

ndisk

ndisk-1

(35)

ハノイの塔:プログラム

void hanoi(int ndisk, char *src, char *dst, char *work) {

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

} }

src : “ 棒 A” dst: “ 棒 B” work: “ 棒 C”

ndisk

ndisk-1

(36)

ハノイの塔:プログラム

void hanoi(int ndisk, char *src, char *dst, char *work) {

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

} }

src : “ 棒 A” dst: “ 棒 B” work: “ 棒 C”

ndisk

ndisk-1

(37)

ハノイの塔:プログラム

void hanoi(int ndisk, char *src, char *dst, char *work) {

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

} }

src : “ 棒 A” dst: “ 棒 B” work: “ 棒 C”

ndisk

ndisk-1

(38)

ハノイの塔:プログラム

void hanoi(int ndisk, char *src, char *dst, char *work) {

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

} }

src : “ 棒 A” dst: “ 棒 B” work: “ 棒 C”

ndisk

ndisk-1

(39)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

A

B

C

hanoi(3, “

A”, “

B”, “

C”)

ゴールのイメージ

(40)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

A

B

C

(41)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

A

B

C

(42)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “A”, C”, “B”)

A

B

C

hanoi(2, “

A”, “

C”, “

B”)

ゴールのイメージ

(43)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

A

B

C

hanoi(2, “

A”, “

C”, “

B”)

ゴールのイメージ

(44)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

A

B

C

(45)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

hanoi(1, “A”, B, “C”)

A

B

C

hanoi(1, “

A”, “

B”, “

C”)

ゴールのイメージ

(46)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

hanoi(1, “A”, B, “C”)

A

B

C

hanoi(1, “

A”, “

B”, “

C”)

ゴールのイメージ

hanoi(1, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

1

src

A work

C

(47)

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(1, “A”, B, “C”)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “A”, C”, “B”)

hanoi(1, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

1

src

A work

C

A

B

C

hanoi(0, “

A”, “

C”, “

B”)

円盤数が

0

なので、

何もしないで戻る

(48)

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(1, “A”, B, “C”)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “A”, C”, “B”)

hanoi(1, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

1

src

A work

C

A

B

C

(49)

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(1, “A”, B, “C”)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “A”, C”, “B”)

hanoi(1, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

1

src

A work

C

A

B

C

move(“

A”, “

B”)

「棒

A

から棒

B

へ移動」

(50)

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(1, “A”, B, “C”)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “A”, C”, “B”)

hanoi(1, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

1

src

A work

C

A

B

C

hanoi(0, “

C”, “

B”, “

A”)

円盤数が

0

なので、

何もしないで戻る

(51)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

hanoi(1, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

1

src

A work

hanoi(1, “A”,B, “C”) C

A

B

C

(52)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

A

B

C

(53)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

A

B

C

move(“

A”, “

C”)

「棒

A

から棒

C

へ移動」

(54)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

A

B

C

hanoi(1, B, C, “A”)

hanoi(1, “

B”, “

C”, “

A”)

ゴールのイメージ

(55)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

A

B

C

hanoi(1, B, C, “A”)

hanoi(1, “

B”, “

C”, “

A”)

ゴールのイメージ

hanoi(1, “

B”, “

C”, “

A”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

1

src

B work

A

(56)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

A

B

C

hanoi(1, B, C, “A”)

hanoi(1, “

B”, “

C”, “

A”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

1

src

B work

A

hanoi(0, “

B”, “

A”, “

C”)

円盤数が

0

なので、

何もしないで戻る

(57)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

A

B

C

hanoi(1, B, C, “A”)

hanoi(1, “

B”, “

C”, “

A”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

1

src

B work

A move(“

B”, “

C”)

「棒

B

から棒

C

へ移動」

(58)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

A

B

C

hanoi(1, B, C, “A”)

hanoi(1, “

B”, “

C”, “

A”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

1

src

B work

A

hanoi(0, “

A”, “

C”, “

B”)

円盤数が

0

なので、

何もしないで戻る

(59)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

A

B

C

hanoi(1, “

B”, “

C”, “

A”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

1

src

B work

A

hanoi(1, B, C, “A”)

(60)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

B

hanoi(2, “A”, C”, “B”)

A

B

C

(61)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

hanoi(2, “

A”, “

C”, “

B”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

C

を使って 移動

2

src

A work

han B

2 oi(

, “

A”, C” 棒 棒 , “

B”)

A

B

C

(62)

ハノイの塔:実行の様子

hanoi(3, “

A”, “

B”, “

C”)

if(ndisk>=1){

hanoi(ndisk-1, src, work, dst);

move(src, dst);

hanoi(ndisk-1, work, dst, src);

}

ndisk

から

枚の円盤を

dst

B

を使って 移動

3

src

A work

C

A

B

C

参照

関連したドキュメント

理工学部・情報理工学部・生命科学部・薬学部 AO 英語基準入学試験【4 月入学】 国際関係学部・グローバル教養学部・情報理工学部 AO

 当図書室は、専門図書館として数学、応用数学、計算機科学、理論物理学の分野の文

「さっぽろテレビ塔」.

* 放射性核種は、 3 H、 79 Se、 90 Sr、 129 I、 137 Cs等の 核分裂生成物、 238 Pu、 239+240 Pu 等のα核種、.. 14 C、 60

吸着塔2A 点検口フランジ部(腐食なし) 吸着塔2A タンク内上部溶接部(腐食なし).. 吸着塔8A 点検口フランジ部(腐食あり)

代替直流電源(バッテリー等)の配備 工事中 完了. 送電鉄塔基礎の補強 ※ ・開閉所設備等の耐震強化工事 ※

従って,今後設計する機器等については,JSME 規格に限定するものではなく,日本工業 規格(JIS)等の国内外の民間規格に適合した工業用品の採用,或いは American

従って,今後設計する機器等については,JSME 規格に限定するものではなく,日本産業 規格(JIS)等の国内外の民間規格に適合した工業用品の採用,或いは American