Heim > Artikel > Backend-Entwicklung > Analysieren Sie, wie PHP den interessanten Tower of Hanoi-Algorithmus implementiert
Es gibt viele Variationen dieser Legende und es ist unbekannt, wer es ist, aber die zurückgelassenen mathematischen Probleme sind sehr klassisch.
Das mathematische Wissen, das er hinterlassen hat: Die Beziehung zwischen der Anzahl der Goldstücke und der Anzahl der Bewegungsschritte beträgt 2^n - 1
.
Die Anzahl der Züge von 1 Goldstück hoch 2 minus 12^n - 1
。
若传说属实,僧侣们需要 2^64 - 1
步才能完成这个任务;假设他们每秒移动一个金片,就需要 5849 亿年才能完成。整个宇宙现在也不过 137 亿年,所以宇宙毁灭还早…(闲的无聊,我还真计算了一下,如下图)
基本规则
汉诺塔算法有2个基本条件,假设移动的是盘子。
1.每次只能移动一个盘子。
2.小盘子必须要在大盘子的上面。
假设本次游戏有3根柱子,分别是 A, B, C。其中一根上已经有排序好的盘子N个,最大的在最下面,依次向上盘子越来越小,另外2根空柱子。
Analysieren Sie, wie PHP den interessanten Tower of Hanoi-Algorithmus implementiert如下图:
需要实现的最终目标是把柱子上所有的盘子都移动到另外一根柱子上。【推荐学习:PHP视频教程】
实现的大概思路:
N-1
个盘子都搬移到B柱子上,只有这样第N个盘子(也就是最大的盘子)才能移动到C柱子上。N-1
个盘子移动到B柱子上,因为要满足条件大的在下,小的在上,所以这 N-1
…
Die Anzahl der Züge von 2 Goldstücken zur n-ten Potenz minus 1
Wenn die Legende wahr ist, benötigen die Mönche2^64 - 1
Schritte zu Unter der Annahme, dass sie jeweils ein Goldstück pro Sekunde bewegen, würde es 584,9 Milliarden Jahre dauern. Das gesamte Universum ist erst 13,7 Milliarden Jahre alt, daher ist es noch früh für die Zerstörung des Universums ... (Mir war langweilig, also habe ich tatsächlich die Berechnung durchgeführt, wie unten gezeigt)
Grundregeln
Der Tower of Hanoi-Algorithmus hat zwei Grundbedingungen, vorausgesetzt dass die Platte bewegt wird. 1. Es kann jeweils nur eine Platte bewegt werden.
2. Der kleine Teller muss auf dem großen Teller liegen.
N-1
-Platten in die Säule B verschieben. Nur so kann die N-te Platte (also die größte Platte) Zur Säule C verschieben. 🎜🎜Verschieben Sie N-1
-Schilder zur Säule B. Da die Bedingungen erfüllt sein müssen, sind die größeren unten und die kleineren oben, also diese N-1-Schilder befinden sich auf der Säule B. Auch die Säulen sind in Ordnung. 🎜🎜Verschieben Sie diese N-1-Platten schließlich von Säule B zu Säule C, um das Endziel zu erreichen. 🎜🎜🎜Zusammenfassend: 🎜🎜🎜Der erste Schritt besteht darin, N-1-Platten von A nach B zu verschieben. 🎜🎜🎜Warum müssen wir N-1 zuerst nach B verschieben? Sie sehen, weil das, was Sie letztendlich erreichen, darin besteht, alle Platten von A nach C zu verschieben, kann die Reihenfolge nicht geändert werden, es kann nur sein, dass die großen unten und die kleinen oben sind. Dann müssen Sie unbedingt zuerst den größten nach C verschieben, sonst sind die Bedingungen nicht erfüllt. 🎜🎜Um den größten Teller von A nach C zu bewegen, müssen Sie den größten Teller auf A räumen, das heißt, alle Teller auf dem größten Teller müssen bewegt werden. Und Sie haben nur 3 Säulen. Auf C dürfen keine weiteren Plattengriffe vorhanden sein, sonst erfüllen Sie die Bedingungen nicht. Alle diese N-1-Platten können nur auf B platziert werden, und sie sind noch in Ordnung. Es entsteht das folgende Bild: 🎜🎜🎜🎜🎜🎜Der zweite Schritt besteht darin, die N-te Platte auf A (d. h. die größte Platte) nach C zu verschieben. 🎜🎜<p>Das ist ganz einfach. Bewegen Sie einfach die größte Platte in einem Schritt von A nach C. Wie unten gezeigt: </p>
<p><img src="https://img.php.cn/upload/article/000/000/020/e50df609a8b176f56d217b586766b982-4.png" alt="Analysieren Sie, wie PHP den interessanten Tower of Hanoi-Algorithmus implementiert"></p>
<p><strong>Der dritte Schritt besteht darin, N-1-Platten von B nach C zu verschieben. </strong></p>
<p>Hinweis: Um N-1-Platten nach C zu verschieben, müssen Sie die größte Platte unter ihnen finden und dann die größte Platte zuerst verschieben. Hier geht es also tatsächlich darum, die Schritte 1 und 2 zu wiederholen, den größten unter diesen N-1 zu finden und ihn zuerst nach C zu verschieben, und der Zyklus wiederholt sich. </p>
<p>Der dritte Schritt entspricht tatsächlich der Änderung der Anforderungen. Angenommen, K = N – 1. <br>Auf Säule B befinden sich K-Schilder, Säule A ist leer und Säule C hat die größte Platte, sodass es bei Säule B mit K-Schildern gleichbedeutend ist, als wäre sie leer. <br>Der erste Schritt besteht darin, die K-1-Platten von B nach A zu verschieben. <br>Der zweite Schritt besteht darin, die K-te Platte von B nach C zu verschieben. <br>Der dritte Schritt besteht darin, die K-1-Platten von A nach C zu verschieben. <br>...</p>
<p> wird zum Bild unten</p>
<p>Suchen Sie zuerst den größten unter den verbleibenden Tellern</p>
<p><img src="https://img.php.cn/upload/article/000/000/020/d1d947b567fd3d8a2295e09c8ff26bf1-5.png" alt=""></p>
<p>und verschieben Sie dann den größten Teller</p>
<p><img src="https://img.php.cn/upload/article/000/000/020/d1d947b567fd3d8a2295e09c8ff26bf1-6.png" alt=""></p>
<p>Dann schleifen Sie, bis nur noch ein Teller übrig ist, und bewegen Sie sich direkt zu C, das Spiel ist vorbei. </p>
<h3>
<span class="header-link octicon octicon-link"></span>Hilfssäulen</h3>
<p>Was sind Hilfssäulen? Angenommen, alle Platten, die Sie verschieben möchten, befinden sich auf A und das Ziel besteht darin, sich nach C zu bewegen. Dann ist B die Hilfssäule von <code>N-1
Platten. Denn sie können hier nur vorübergehend existieren, sonst entsprechen sie nicht den Spielregeln.
Hier müssen Sie zuerst die Hilfspfeiler herausfinden. Denken Sie nicht darüber nach, wie Sie sie umsetzen, sondern klären Sie zunächst nur die Logik.
Der zweite Schritt besteht darin, die [N-te] Platte von A nach C zu verschiebenDas Folgende ist der in PHP implementierte Pseudocode:Der dritte Schritt besteht darin, die [N-te] Platte zu verschieben verbleibend] -1 Stück] Die Platte bewegt sich von B nach C
class HanoiTower { // 计数器 public $count = 0; /** * 汉诺塔实现 * * @param $n 盘子号 * @param $A 初始柱子 * @param $B 中转站 * @param $C 目标柱子 */ public function hanoi($n, $A, $B, $C) { if ($n == 1) { // 退出条件 只剩一个盘子的时候直接从A移动到C $this->biggestOne($n, $A, $B, $C); } else { // Analysieren Sie, wie PHP den interessanten Tower of Hanoi-Algorithmus implementiert把 【n-1】 个盘子从A移动到B 此时C为中转站 $this->hanoi($n - 1, $A, $C, $B); // Analysieren Sie, wie PHP den interessanten Tower of Hanoi-Algorithmus implementiert把 【第n】 个盘子从A移动到C $this->biggestOne($n, $A, $B, $C); // 第三步把B上 【剩余的n-1个】 盘子从B移动到C 此时A为中转站 $this->hanoi($n - 1, $B, $A, $C); } } /** * 移动最大的盘子 * 直接从A移动到C */ public function biggestOne($n, $A, $B, $C) { ++$this->count; echo '第', $this->count, '步 ', '把 ', $n, '从 ', $A, '移动到', $C, '<br />'; } } $n = 5; $hanoiTower = new HanoiTower(); echo '这是一个有 【', $n, '】 个盘子的汉诺塔:', '<br />'; // 调用执行 $hanoiTower->hanoi($n, 'A', 'B', 'C'); echo '总共需要走:【', $hanoiTower->count, '】 步';Die Ergebnisse sind wie folgt:
Das obige ist der detaillierte Inhalt vonAnalysieren Sie, wie PHP den interessanten Tower of Hanoi-Algorithmus implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!