J'ai besoin d'explications sur le fonctionnement de mon code de récursivité Tower of Hanoi


Je viens d'entrer dans la récursivité et je pense que j'ai une compréhension de base de son fonctionnement. J'ai ce code pour un problème de Tour de Hanoi et je le regarde depuis une heure en essayant de comprendre exactement ce qu'il fait. La méthode 'moveDisks' est déroutante pour moi. J'espérais que quelqu'un pourrait aider à expliquer ce qui se passe dans la méthode. Je n'ai pas l'écrire.

Pour essayer de comprendre, j'ai exécuté le code et mis 2 pour le nombre de disques. Voici ce qui est imprimé:

Les mouvements être: Déplacer le disque 1 de A à C, Déplacer le disque 2 de A à B, Déplacer le disque 1 de C à B

Donc, si je comprends bien, le 2 nous amène au bloc "else", ce qui signifie que 2-1 va passer de A à C. Et puis il soustrait à nouveau 1 pour faire un autre mouvement? Je ne comprends pas ce qui se passe ensuite ou pourquoi la nécessité d'alterner les tours.

import java.util.Scanner; 

public class TowersOfHanoi {
  /** Main method */
  public static void main(String[] args) {
    // Create a Scanner
    Scanner input = new Scanner(System.in);
    System.out.print("Enter number of disks: ");
    int n = input.nextInt();

    // Find the solution recursively
    System.out.println("The moves are:");
    moveDisks(n, 'A', 'B', 'C');
  }

  /** The method for finding the solution to move n disks
      from fromTower to toTower with auxTower */

  public static void moveDisks(int n, char fromTower,
      char toTower, char auxTower) {
    if (n == 1) // Stopping condition
      System.out.println("Move disk " + n + " from " +
        fromTower + " to " + toTower);
    else {
      moveDisks(n - 1, fromTower, auxTower, toTower);
      System.out.println("Move disk " + n + " from " +
        fromTower + " to " + toTower);
      moveDisks(n - 1, auxTower, toTower, fromTower);
    }
  }
}
Author: Chap, 2016-02-12

1 answers

La Récursivité est un acte de foi. Le fait est que vous n'avez pas besoin d'essayer de contrôler chaque petit détail. Vous supposez simplement que vous avez déjà écrit votre fonction et qu'elle fonctionne correctement. Alors vous l'utilisez. C'est tout.

Donc, c'est l'induction en sens inverse.

Avec les Tours, vous supposez qu'il est déjà à votre disposition. Ainsi, pour déplacer n disques de A à B, vous vous déplacez (n-1) disques de A à C. Vous avez maintenant le plus grand disque encore, et bien ordonnées (n-1) disques à C. c'est Le B vide. Déplacez simplement votre dernier disque de A à B et déplacez les (n-1) disques de C à B. Vous avez terminé.

Il est correct de déplacer des disques n-1 même lorsque le disque n est allongé, car tous les disques n-1 sont plus petits que n, et donc le disque n peut être ignoré en toute sécurité. Même chose pour tout m, 0 < m < n.

Déplacer des disques 0 est encore plus facile et ne viole aucune loi non plus.


À votre question spécifique,

Et puis il soustrait 1 à nouveau pour faire un autre mouvement?

Non, la n est toujours le même, donc (n-1) est le même dans les deux cas.

Vous alternez les tours pour atterrir sur la droite à la fin.

 3
Author: Will Ness, 2017-12-15 21:58:20