Heim  >  Fragen und Antworten  >  Hauptteil

javascript – Fragen Sie nach dem Tower of Hanoi-Algorithmus

JS verwendet Rekursion, um die Schritte zur Fertigstellung des Turms von Hanoi zu implementieren.
In meiner Freizeit habe ich ein Tower of Hanoi-Spiel geschrieben. Es enthält eine Erinnerungsfunktion. Wenn der Benutzer auf die Erinnerung klickt, implementiert das Programm einen Abschlussschritt und führt ihn dann entsprechend aus dieser Schritt.
Teilcode lautet wie folgt:

var moves = [];  // 存放完成步骤
/**
 * @param disc      当前关卡 (实际上也就是圆盘数量)
 * @param discs1    第一根圆柱
 * @param discs2    第二根圆柱
 * @param discs3    第三根圆柱
 */
function hanoiArithmetic(disc, discs1, discs2, discs3) {
    if (disc > 0) {
        hanoiArithmetic(disc - 1, discs1, discs3, discs2);
        moves.push(discs1 + '>' + discs3);
        hanoiArithmetic(disc - 1, discs2, discs1, discs3);
    }
}
hanoiArithmetic(4, 'discs1', 'discs2', 'discs3');
console.log(moves); 
// 最后得到这样一个步骤列表
[ 'discs1>discs3',
  'discs1>discs2',
  'discs3>discs2',
  'discs1>discs3',
  'discs2>discs1',
  'discs2>discs3',
  'discs1>discs3' ] // 大概意思就是想从第一个圆柱取最上面那个圆盘放到第三个圆柱...

Alles ist in Ordnung. Das Problem ist, dass dies nur eine neue Ebene sein kann. Wenn der Benutzer beispielsweise keine Datenträger verschoben hat, wird jetzt eine Schrittliste erstellt Es gibt 3 Scheiben auf dem ersten Zylinder, 2 Scheiben auf dem zweiten und 1 Scheibe auf dem dritten. Der Benutzer ist ratlos und weiß nicht, was er als Nächstes tun soll. Er klickt auf die Erinnerungsschaltfläche Wie Wie sieht es mit der Situation aus, um den Algorithmus für nachfolgende Schritte zu generieren?
Ich schäme mich zu sagen, dass dieses Spiel vor einem halben Jahr geschrieben wurde. Bisher ist die Erinnerungsfunktion noch nicht abgeschlossen und ich habe überhaupt keine Ahnung.

漂亮男人漂亮男人2710 Tage vor2600

Antworte allen(2)Ich werde antworten

  • phpcn_u1582

    phpcn_u15822017-05-19 10:45:07

    这个你可以看斐波拉契数列 汉诺塔就是斐波拉契算法

    Antwort
    0
  • phpcn_u1582

    phpcn_u15822017-05-19 10:45:07

    如果需要这样的提醒功能,比你现在的复杂一些,需要纪录状态。
    比如你这个例子是6个圆盘,第一根柱子上3个圆盘,有可能是456,也有可能是135,你需要明确现在的状态,然后完成步骤再从上向下分解。

    if 最大圆盘不在目标圆柱上 {
      if 最大圆盘不能直接移动到目标圆柱 {
        其他圆盘移动到“中间”圆柱(规模减一)  //非最大圆盘所在圆柱和目标圆柱
      } 
      移动最大圆盘到目标圆柱
    }
    移动其他圆盘到目标圆柱(规模减一)

    Antwort
    0
  • StornierenAntwort