papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Résolution : Tour de Hanoï par une procédure récursive Mar 12 Mai 2020 - 0:46 | |
| Le code suivant ne fonctionne qu'avec le compilateur car il utilise une procédure récursive (interdite pour l'interpréteur) - Code:
-
rem ============================================================================ rem Résolution du jeu : Tour de Hanoï par une procédure récursive rem Pour PANORAMIC Compiler V 0.9 beta 18 rem Papydall 11 / 05 / 2020 rem ============================================================================ rem Wikipédia : rem Les tours de Hanoï (originellement, la tour d’Hanoïa) sont un jeu de réflexion rem imaginé par le mathématicien français Édouard Lucas, et consistant à déplacer rem des disques de diamètres différents d’une tour de "départ" à une tour d’"arrivée" rem en passant par une tour "intermédiaire", et ceci en un minimum de coups, rem tout en respectant les règles suivantes : rem on ne peut déplacer plus d’un disque à la fois ; rem on ne peut placer un disque que sur un autre disque plus grand que lui ou rem sur un emplacement vide. rem ============================================================================ rem Il est à signaler que si n est le nombre de disques, il faut 2^n - 1 coups rem au minimum pour parvenir à ses fins, quantité qui augmente très rapidement rem avec n. rem ============================================================================ dim n,coup width 0,500 : height 0,600 alpha 10 : top 10,20 : left 10,80 : font_name 10,"arial black" : font_size 10,12 caption 10, "Résolution du jeu Tour de Hanoï" list 20 : top 20,50 : left 20,20 : width 20,450 : height 20,500 : font_bold 20 n = 5 : ' Essayer avec d'autres valeurs de n : 3 ou 8 ou ... Move(n,1,2,3) font_color 20,0,0,255 item_add 20,"" item_add 20,"Il faut au minimum : " + str$(coup) + " déplacements pour résoudre ce jeu de " + str$(n) + " disques" end rem ============================================================================ ' Procédure récursive ' Appel Move(n,1,2,3) ' avec n le nombre de disques de départ SUB Move(n,depart,arrivee,intermediaire) dim_local e$ IF n > 0 move(n-1, depart, intermediaire, arrivee) : ' 1er appel récursif coup = coup + 1 if coup < 10 e$ = "00" else if coup < 100 e$ = "0" else e$ = "" end_if end_if item_add 20, "Coup N° : " + e$ + str$(coup) + " Déplacer le disque du plateau " + STR$(depart) + " au plateau " + STR$(arrivee) move(n-1, intermediaire, arrivee, depart) : ' second appel récursif END_IF END_SUB rem ============================================================================
Vous pouvez toujours l'essayer avec l'interpréteur : vous ne recevez pas de message d'erreur, mais le résultat est absolument FAUX! | |
|