「ハノイの塔アルゴリズム」の詳細図

こんにちは、こんにちは、私は小さな灰色の類人猿で、バグを書くことができるプログラマーです、

今日は、再帰的な古典的アルゴリズム---「ハノイの塔」の事例を紹介します。

ハノイの塔のレビュー

ハノイの塔(ハノイの塔)は、インドの伝説に由来しています。大梵天が世界を創造したとき、彼は3つのダイヤモンドの柱を作り、そのうちの1つは64個の金色の円盤を下から上に積み上げました。グレートブラフマーは、下からサイズの順にディスクを別の柱に再配置するようにバラモンに命じました。また、小さなディスクではディスクを拡大することはできず、一度に3本の柱の間を移動できるディスクは1つだけであると規定されています。

これはよく知られた問題であり、ほとんどすべての教科書この問題の紹介があります条件は

転写カラムの助けを借りて、規則に従って開始カラムに配置されたプレートは終了カラムに移動され、一度に移動できるプレートは1つだけであり、大きなプレートを小さなプレートに配置することはできません。プレートなので、64プレートの移動数は18,446,744,073,709,551,615です。

これは天文学的な数値です。マイクロ秒ごとの動きを計算できる(出力しない)ことができれば、100万年近くかかるでしょう。Nの値が小さい場合にのみ、問題の解決策を見つけてハノイの塔を解決することができますが、64階建てのハノイの塔をコンピューターで解決することは困難です。

通常のプログラミング演習では、ハノイの塔の問題も非常に一般的なアルゴリズムのケースです。今日は、友達と一緒にハノイの塔の問題の解決策を分析します。

まず、3層のハノイの塔の図を見て、ハノイの塔の問題の解決策を簡単に理解しましょう。

 

上の図に示すように、プレートの数が1つしかない場合は、プレートをターゲットプレートに直接移動して、3層のハノイの塔の問題を解決できることがわかります。最初に、ターゲットプレートを使用して上部の2つのプレートを中央のカルーセルに移動し、次に最大のプレートをターゲットプレートに移動し、次に中央のカルーセルの最初のプレートを開始プレートに移動します。2番目のディスクをターゲットディスク、最後に開始ディスクの最初のディスクをターゲットディスクに移動します。

これから、n層のハノイの塔のソリューションを要約できます。

現在の転送トレイ(必ずしもトレイBである必要はありません)を使用して、最初のn-1トレイを隣接する空のトレイに移動し、次にn番目のトレイをターゲットトレイに移動し、すべてのトレイがに移動するまで上記の手順を繰り返します。ターゲットディスク。関数メソッドの再帰的なアイデアもここで使用されます。

 

次に、JavaとPythonを使用して、n次のハノイの塔の解法を示します。

Javaはハノイの塔を解決します

package 汉诺塔算法;


public class Hanoi {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Hanoi h = new Hanoi();
		char a = 'A';
		char b = 'B';
		char c = 'C';
		int count = h.hanoi(3, a, b, c);
		System.out.println(count);
	}
	
	/**
	 * 汉诺塔问题
	 * @param n 阶数
	 * @param a 起始柱
	 * @param b 中转柱
	 * @param c 目标柱
	 * @return 移动次数
	 * */
	public int hanoi(int n,char a,char b,char c) {
		if (n == 1) {
			move(a, c);
		} else {
			hanoi(n-1, a, c, b);
			move(a, c);
			hanoi(n-1, b, a, c);
		}
		//汉诺塔的移动次数为(2**n)-1
		return (int) Math.pow(2, n)-1;
	}
	
	public void move(char a,char b) {
		System.out.println(a + "--->" + "b");
	}
}

Pythonはハノイの塔を解決します

i = 1   # 定义全局变量记录次数
def move(n, a, c):
    global i
    print("第{}步:将编号为{}的盘子从{}--->{}".format(i, n, a, c))
    i += 1
def hanoi(n,a,b,c):
    #a,b,c分别是三根柱子,n为套在a柱上的圆圈个数
    if n == 1:
        move(n, a, c)
    else:
        hanoi(n-1, a, c, b)
        move(n, a, c)
        hanoi(n-1, b, a, c)
if __name__ == '__main__':
    n = int(input("请输入盘子数量:"))
    hanoi(n, "A", "B", "C")

さて、ハノイの塔についての説明はここで友達と共有します。欠陥がある場合は、みんなが私を訂正してくれることを願っています。大きな悪いオオカミがあなたに同行して進歩します!

おすすめ

転載: blog.csdn.net/weixin_44985880/article/details/111416152