Javascript(42)ChatGPTでハノイの塔の解き方

Javascriptの紹介画像 javascript

前回はHTMLテンプレートをカスタマイズについて紹介しました。

HTML(41)HTMLテンプレートをカスタマイズ
今回は、HTMLテンプレートをカスタマイズする方法について紹介します。ChatGPTを活用して作成します。

今回はChatGPTでハノイの塔の解き方について紹介していきます。

【もっと詳しく知りたい人は是非これを読んでください!!】

1冊ですべて身につくJavaScript入門講座 [ Mana ]

価格:2794円
(2025/1/12 23:09時点)
感想(2件)

 

ChatGPTと学ぶ再帰アルゴリズム:「ハノイの塔」を解いてみよう

 

プログラミングの世界には、再帰アルゴリズムと呼ばれる興味深いテクニックがあります。これは関数が自分自身を呼び出して問題を解決する方法で、一見不思議ですが強力な手法です。今回の記事では、ChatGPTを解説サポート役に迎え、初心者でも理解しやすいように再帰アルゴリズムの基礎を学びます。具体例として、有名なパズルハノイの塔をJavaScriptで解いてみましょう。再帰の考え方からコード実装、応用例まで、丁寧にステップバイステップで解説します。

再帰アルゴリズムとは?

ChatGPTの解説: 再帰アルゴリズムとは、「自分自身を呼び出す」アルゴリズムのことです。つまり、ある関数の中で自分自身をもう一度呼び出して処理を繰り返す仕組みです。問題を少しずつ小さく分割し、最終的に簡単なケースまで分解してから解決する考え方に基づいています。

再帰アルゴリズムでは、通常2つの重要な部分があります。それが「ベースケース」と「再帰ケース」です。ベースケースとは再帰呼び出しを終了させるための条件のことです。これがないと関数は無限に自分自身を呼び続けてしまい、プログラムが終わらなくなってしまいます。再帰ケースとは、問題をより小さな同種の問題に分割して自分自身を呼び出す部分です。再帰ケースによって問題を解決するために自分自身を再度呼び、ベースケースに近づけていきます。

例えば、階乗n!)の計算やフィボナッチ数列の生成などは典型的な再帰アルゴリズムの例です。再帰を使うと、これらの問題をとてもシンプルなコードで表現できます。ただし、再帰を使う際は終了条件(ベースケース)を必ず設けることが重要です。そうしないと無限ループになり、プログラムが停止しなくなってしまいます。

再帰アルゴリズムの考え方に慣れると、複雑な問題でもコードを簡潔に書けるようになります。ここからは具体的な例として、「ハノイの塔」パズルを取り上げ、再帰の力で解決する方法を学んでみましょう。

ハノイの塔パズルとは?

ハノイの塔は、3本の杭と複数の円盤を使った古典的なパズルゲームです。円盤は大きさがすべて異なり、最初は一つの杭に大きいものを下に、小さいものを上に重ねた円盤の塔を作った状態から始まります。目的は、すべての円盤を別の杭へ移動させて塔を再現することです。ただし、移動には次のルールがあります。

  • 一度に動かせる円盤は1枚だけ
  • 常に上にある円盤(各杭の一番上)だけを別の杭に移動できる。
  • どの円盤も、自分より小さい円盤の上に置いてはならない(小さい円盤の上に大きい円盤は載せられない)。

ルールは単純ですが、円盤の数が増えると非常に移動手順が複雑になります。例えば、円盤が3枚の場合は最短で7手(移動回数7回)で解けます。実は一般に、円盤がn枚のハノイの塔を解く最小手数は2n - 1回になることが知られています。この指数的に増える手順を、再帰アルゴリズムを使って美しく表現できるのが「ハノイの塔」の面白いところです。

それでは、ChatGPTと一緒に考えながら、このハノイの塔パズルを再帰を使って解いてみましょう。

再帰を使ったハノイの塔の解き方

ハノイの塔を解くカギは、同じパズルの規模を縮小して考えることです。具体的には、円盤n枚を移動したい場合、一番大きな円盤(n番目の円盤)に注目します。この円盤を目的の杭に動かすには、邪魔になっている上に載ったn-1枚の円盤を別の場所にどかす必要があります。つまり、まず「上にあるn-1枚の円盤を一時的に別の杭へ移動する」ことを考えます。

一時避難が完了したら、次に一番下の大きな円盤を目的の杭へ動かします。最後に、先ほど避難させておいたn-1枚の円盤を、その大きな円盤の上に移し戻せばゴールです。この戦略を取ることで、「円盤n枚の問題」を「円盤(n-1)枚の問題にうまく分解できます。

ここで再帰的な考え方を整理しましょう。

  1. ベースケース: 円盤が1枚なら、単純に目的の杭へ移動すれば完了です(それ以上分解する必要はありません)。
  2. 再帰ケース: 円盤がn枚ある場合、まずn-1枚の円盤を補助の杭へ移動します(同じ問題の規模を縮小した形)。次に残った一番大きな円盤を目的の杭へ動かします。最後に、補助の杭に置いたn-1枚を目的の杭へ移動します。

この手順自体が再帰的構造を持っており、1番のケース(1枚の場合)にたどり着くまで自分自身を呼び出して解決することになります。それでは、この論理をJavaScriptのコードで実装してみましょう。

JavaScriptでハノイの塔を実装してみよう

いよいよ、再帰アルゴリズムを使ってハノイの塔の解法をコードにしてみます。ここではJavaScriptで実装し、コンソールに円盤の移動手順を出力するプログラムを書いてみましょう。ChatGPTがコードのポイントをコメントで案内します。


// ハノイの塔を解く再帰関数
function hanoi(n, from, to, aux) {
    if (n === 1) {
        // ベースケース: 円盤1をそのまま移動
        console.log(`${from}から${to}へ円盤1を移動`);
    } else {
        // 再帰ケース:
        // 1. n-1枚を補助の杭(aux)へ移動
        hanoi(n - 1, from, aux, to);

        // 2. 最大の円盤(n番)を目的の杭(to)へ移動
        console.log(`${from}から${to}へ円盤${n}を移動`);

        // 3. 補助の杭(aux)に置いたn-1枚を目的の杭(to)へ移動
        hanoi(n - 1, aux, to, from);
    }
}
  

この関数hanoi(n, from, to, aux)は、n枚の円盤をfromという杭からtoという杭へ、aux(補助の杭)を使って移動する手順を出力します。再帰関数hanoiの中で、自分自身(hanoi関数)を呼び出している点に注目してください。まずif (n === 1)の部分がベースケースで、円盤が1枚なら直接目的地へ移すだけです。それ以外の場合は再帰ケースとなり、hanoi(n - 1, from, aux, to)で円盤の山を一時退避し、続いて一番大きな円盤を移動し(console.logの行)、最後に退避させた円盤を元に戻す(hanoi(n - 1, aux, to, from))という3段階になっています。

コード中のconsole.logによって、円盤の移動手順がコンソールに表示されます。では、この関数を実際に動かしてみたとしましょう。例えば、円盤3枚を杭Aから杭Cへ移動する場合(杭Bを補助に使う)、出力される手順は次のようになります。


// 例: 円盤3枚をA杭からC杭へ移動する
hanoi(3, 'A', 'C', 'B');

// (コンソール出力の例)
// AからCへ円盤1を移動
// AからBへ円盤2を移動
// CからBへ円盤1を移動
// AからCへ円盤3を移動
// BからAへ円盤1を移動
// BからCへ円盤2を移動
// AからCへ円盤1を移動
  

手順を追ってみると、まず小さな2枚(円盤1と2)を一旦B杭に避難させ、次に大きな円盤3をC杭へ移動しています。その後、B杭に退避させていた円盤2と1を順にC杭へ移し直して、最終的に3枚すべてがAからCに移動できていることがわかります。このように再帰関数hanoiは、自分自身を呼び出しながら問題を分割し、最終的な解を組み立てています。

再帰の流れに慣れていないと、最初は関数の呼び出しが頭の中で混乱するかもしれません。しかし、ChatGPTのような説明役がポイントを押さえて整理すると、処理の流れが見えてきますね。では次に、ChatGPTからいくつか補足のアドバイスをもらいましょう。

ChatGPTからの補足アドバイス

ChatGPT: ここまでハノイの塔の再帰アルゴリズムを実装してきましたが、初心者の方がつまずきやすいポイントを補足しますね。

  • 再帰の視覚化: 再帰処理がわかりにくい場合は、紙に書いて関数呼び出しの流れを追ってみましょう。例えば、hanoi(3, 'A', 'C', 'B')の呼び出しが内部でどう展開されるかを図に描くと、処理の順序がはっきりします。
  • デバッグ方法: 実際にコードを動かしてみて、console.logの出力を確認することはとても有効です。今回の例でも、出力されたログを見れば再帰が正しく機能しているか追跡できます。
  • 終了条件の重要性: 再帰関数には必ず終了条件(ベースケース)を入れましょう。もしif (n === 1)の部分がなかったら、再帰呼び出しが止まらず永遠に関数を呼び続けてしまいます。これはプログラムのバグやクラッシュにつながるので注意が必要です。
  • スタックオーバーフロー: 再帰呼び出しが深くなりすぎると、システムが管理する呼び出し履歴(コールスタック)がいっぱいになってエラー(スタックオーバーフロー)が起きる場合があります。今回のハノイの塔の例では、扱う円盤の数が極端に大きくなければ問題ありませんが、再帰アルゴリズム一般では無限再帰や過度な深さに注意しましょう。

これらのポイントに気をつければ、再帰アルゴリズムは怖くありません。ChatGPTも、疑問があればいつでも答えてくれる頼もしい先生として活用できますよ。

初心者向けまとめ

今回、ChatGPTの解説とともにJavaScriptで再帰アルゴリズムの一例として「ハノイの塔」パズルを解く方法を学びました。最後に、重要なポイントを整理しましょう。

  • 再帰アルゴリズムの基本: 関数が自分自身を呼び出すことで問題を解決する手法。終了条件(ベースケース)と再帰的処理(再帰ケース)を明確にする。
  • ハノイの塔のルール: 3本の杭と複数の円盤によるパズル。一度に1枚、上の円盤しか動かせず、小さい円盤の上に大きい円盤を置けない。
  • 再帰解法の考え方: 円盤n枚の問題を、まずn-1枚の部分問題に分解→大きな円盤を移動→部分問題を解決、という手順に落とし込む。
  • JavaScriptでの実装: 再帰関数hanoiを定義し、if文でベースケース(n === 1)を処理。それ以外は再帰呼び出しで分割・解決し、console.logで移動手順を出力。
  • 再帰に慣れるコツ: 小さなケースで実験し、出力や処理の流れを確認する。必要に応じて図解しながら、再帰の展開を追うと理解しやすい。

再帰アルゴリズムは初めて触れると難しく感じるかもしれませんが、一度コツを掴めばプログラミングの強力な武器になります。ハノイの塔の例で得た知識を、ぜひ他の問題にも応用してみてください。

今後の応用・展望

ハノイの塔で再帰の概念を理解できたら、これをきっかけに他の様々なアルゴリズムへ応用してみましょう。再帰は探索アルゴリズム分割統治法(Divide and Conquer)の基礎としても頻繁に使われます。例えば、二分探索マージソートクイックソートといったソートアルゴリズム、木構造の巡回(二分木の探索など)にも再帰が活躍しています。

また、再帰的なアプローチはバックトラッキングと呼ばれる問題解決法にも現れます。これは、迷路を解くプログラムや数独パズルの解法、八皇后問題のような組み合わせ探索問題などで使われる手法です。今回学んだハノイの塔の再帰処理は、そうした複雑な問題にも通じる考え方の基礎になっています。

最後に、ChatGPTなどのAIも活用しながら学習を続けてみましょう。わからないことがあれば質問を投げかけることで、コードの解説やヒントを得ることができます。再帰アルゴリズムに限らず、新しいプログラミングの概念に挑戦するときは、AIアシスタントが24時間助けてくれる心強い味方になります。

以上、ChatGPTと一緒に学ぶ再帰アルゴリズム「ハノイの塔」の解法でした。再帰の考え方とその応用可能性に触れたことで、今後のプログラミング学習の幅が広がれば幸いです。それでは、これからも楽しみながらコードを書いていきましょう!

以上がChatGPTとJavascriptを活用してハノイの塔の解き方の紹介になります。
次回はChatGPTとjavascriptを活用して花火のアニメーションを作成の仕方を紹介します。