Nombre de coups de la tour de Hanoï

La tour de Hanoï est un jeu inventé par le mathématicien français Édouard Lucas.

Les règles sont simples :

  • le jeu est organisé autour de trois bâtons de bois que l'on nommera \(a\), \(b\) et \(c\) ;
  • sur ces bâtons on glisse des pièces circulaires de diamètres différents. Le nombre de pièces est appelé \(n\) ;
  • les pièces doivent toujours être empilées dans un ordre décroissant : il est interdit de poser une grande pièce sur une petite ;
  • à chaque étape on déplace une pièce d'un bâton à l'autre ;
  • initialement, les pièces sont sur le bâton \(a\). Le but du jeu est de les amener sur le bâton \(c\).

Tour de Hanoï

Un stratégie de résolution optimale, qui résout le problème en un nombre minimal de déplacements, repose sur l'observation suivante. Transporter \(n\) pièces du bâton \(a\) vers le \(c\) nécessite de :

  • transporter les \(n - 1\) pièces du dessus du bâton \(a\) vers le \(b\) ;
  • déplacer la plus grande pièce du bâton \(a\) vers le \(c\) ;
  • transporter les \(n - 1\) pièces du bâton \(b\) vers le \(c\).

L'illustration ci-dessous1 illustre la résolution du problème dans le cas \(n = 4\) :

Animation

On cherche dans cet exercice à calculer le nombre de coups minimal permettant de résoudre le problème à \(n\) pièces. On note appelle \((u_n)\) la suite définie pour \(n > 0\) et donnant le nombre de coups nécessaires à l'exécution de la stratégie proposée dans le cas de \(n\) pièces.

On a donc :

\[ \begin{align*} u_1 &= 1&\\ \\ u_2 &= 1 + 1 + 1 \\ &= 3\\ \\ u_3 &= 3 + 1 + 3 \\ &= 7\\ \\ u_4 &= 7 + 1 + 7 \\ &= 15 \end{align*} \]
Suite définie par récurrence

De façon générale, on montre que :

\[ \begin{align*} & u_1=1\\ \text{Pour tout }n>0,\qquad & u_{n+1} = 2u_n+1 \end{align*} \]

Écrire la fonction nb_coups qui prend en paramètre l'entier n représentant le nombre de pièces à déplacer (n > 0) et renvoie le nombre de coups permettant de résoudre le problème en appliquant la stratégie décrite.

Exemples
>>> nb_coups(1)
1
>>> nb_coups(2)
3
>>> nb_coups(3)
7
>>> nb_coups(10)
1023

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013(lbsSetph4rd5f1uma"ov+wg,_/3=in k:)y *2Pc030g0a0b0m0y06080F0J060m08080x0n0b0y0c0n020A03080k0l0l0m0f0E02090o060k0!0o0z030v0*0,0.0:0(0c0203130|160v130(0g0y0p0S0U0W0Y0d0y0s0d061k0d0b0%030N07060a1f0V0X0n1j1l1n1l0b1t1v1r0b0f140b0d0S0?080c0m0z0Y0H0n1x1h0n0i0P0a0z0m0l0a1r1Q1S1X1z1!1v1%1(0%040F0I0f0o0c0o080y0_0z0F0L1O0f0f0a0J200|1+0z140v1M2d1J1L1K1s0g1-0Y1n0z1$1}1r1c1e0T1y2n0y2p0z0o2t1r0c26142b2d2H0)1R212v1Y2A0f0-060%0j2a2L0'2K1,2N1z2P2R0%0H2V1S2X2b2m0n2$0m2S020w2)2c0(2,2!0Y2/2;0e2@2+2L2-2}0%0h30172F0|2t2g0g1L2l2{0n0J2B1)143b15392J0}2W033i0L2G323g0B0%0L0i300F2Y2M1g2#0i0%0z070u3i0k0c08372`3G0Y0$02053R3w3T2.3J3Y2Z3!3V0D0C300A0F3.3D3S2w3#020k3C3E2-0o0%0x3_3;1Y0l0y2T3,3/3:3Z3=3y020i0o0f3 482O0%0y4f3'3=0o0r4i0{3q2*474l2O070%0f1S0s0a3%3F3=3V3X4r2c3`3g42444H3v4u1z3V0t4k4D4h024q2J404Q0%3*45463/4J3!0z0%3^4N4t4U1z3|023~4.4)3=4L022(4^4Z0Y4=0G4T334,533g4=0q563!4{2U4N3-4(4 0n4a260b0k0f4X2W4/543@3,0|3t0a2d2E5w3a1d3c2g2j2e0m1u5z0v3b0(5J0M0O0Q02.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013(lbsSetph4rd5f1uma"ov+wg,_/3=in k:)y *2Pc030g0a0b0m0y06080F0J060m08080x0n0b0y0c0n020A03080k0l0l0m0f0E02090o060k0!0o0z030v0*0,0.0:0(0c0203130|160v130(0g0y0p0S0U0W0Y0d0y0s0d061k0d0b0%030N07060a1f0V0X0n1j1l1n1l0b1t1v1r0b0f140b0d0S0?080c0m0z0Y0H0n1x1h0n0i0P0a0z0m0l0a1r1Q1S1X1z1!1v1%1(0%040F0I0f0o0c0o080y0_0z0F0L1O0f0f0a0J200|1+0z140v1M2d1J1L1K1s0g1-0Y1n0z1$1}1r1c1e0T1y2n0y2p0z0o2t1r0c26142b2d2H0)1R212v1Y2A0f0-060%0j2a2L0'2K1,2N1z2P2R0%0H2V1S2X2b2m0n2$0m2S020w2)2c0(2,2!0Y2/2;0e2@2+2L2-2}0%0h30172F0|2t2g0g1L2l2{0n0J2B1)143b15392J0}2W033i0L2G323g0B0%0L0i300F2Y2M1g2#0i0%0z070u3i0k0c08372`3G0Y0$02053R3w3T2.3J3Y2Z3!3V0D0C300A0F3.3D3S2w3#020k3C3E2-0o0%0x3_3;1Y0l0y2T3,3/3:3Z3=3y020i0o0f3 482O0%0y4f3'3=0o0r4i0{3q2*474l2O070%0f1S0s0a3%3F3=3V3X4r2c3`3g42444H3v4u1z3V0t4k4D4h024q2J404Q0%3*45463/4J3!0z0%3^4N4t4U1z3|023~4.4)3=4L022(4^4Z0Y4=0G4T334,533g4=0q563!4{2U4N3-4(4 0n4a260b0k0f4X2W4/543@3,0|3t0a2d2E5w3a1d3c2g2j2e0m1u5z0v3b0(5J0M0O0Q02.
Suite définie explicitement

On donne ci-dessous les premières valeurs de \(u_n\) :

\[u_1 = 1 \qquad u_2 = 3 \qquad u_3 = 7 \qquad u_4 = 15 \qquad...\qquad u_{10} = 1\,023 \qquad...\qquad u_{20} = 1\,048\,575 \qquad\]

On peut montrer qu'il existe une formule permettant de calculer directement \(u_n\) à l'aide de la seule valeur de \(n\) et ce, sans utiliser par la formule de récurrence de la question précédente.

On ne fournit pas cette formule explicite, il est demandé de la conjecturer.

Écrire la fonction nb_coups qui prend en paramètre l'entier n représentant le nombre de pièces à déplacer (n > 0) et renvoie le nombre de coups permettant de résoudre le problème en appliquant la stratégie décrite.

Grandes valeurs de \(n\)

La fonction demandée doit calculer explicitement la valeur cherchée sans utiliser de boucle ni de formule de récurrence.

Les tests secrets portent sur de très grandes valeurs de \(n\). Ainsi, un algorithme structuré autour d'une boucle aura pour conséquence de bloquer le navigateur.

Exemples
>>> nb_coups(1)
1
>>> nb_coups(2)
3
>>> nb_coups(3)
7
>>> nb_coups(10)
1023

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013\[(lbsS^]et-ph;rdxA.Uf10uma"ov+g,_/R3=in{ Ok:é)y *}q2Pc030l0e0f0v0H080a0R0X080v0a0a0G0w0f0H0h0w020K030a0t0u0u0v0k0Q020b0x080t0;0x0I0R000v0u0h0j0R0E0e0~0k0U0t0e0a030D0{0}0 110_0h02031w1p1z0D1w0_0l0H0y0)0+0-0/0i0H0A0i081N0i0f0@030#09080e1I0,0.0w1M1O1Q1O0f1W1Y1U0f0k1x0f0i0)140a0h0v0I0/0V0w1!1K0w0q0%0e0I1c0e1U1_1{201$231Y260u2802040R0W0k0x0h0x0a0H17190Z1@0k0k0e0X2t1p2a0I1x0D1=2F1/1;1:1V0l2c0/1Q0I252q1U1F1H0*1#2P0H2R0I0x2V1U0h2y1x2D2F2,0`1`192X212$0k0~080@0r2C2:0^2/2b2=1$2@2_0@0V2}1{2F2)0e2F2V2I0l1;2N320/0X2%2i0Y1G1x3b2+2~382E033l0Z3s311J1$0M0@0Z0q3u020R302;3B0/0I0q0@0I090C3l0t0h1o1q3t2D2O0w0?02073H3K3#0I3Q3)3!3j3$0@0P0N3H0K0R3`3J3/3M0w3D022y0f0t0k0I3H3|2:3#0u0H363.493:0x0@0S0S4e3A2Y0w3,02463Y39484m214h020g473*3:4b2{3^1p3x3c1A2*1p3e1p0f3g4N2L2G0v1X4I0D3e1v3z3L4n2y0u0C0q0v0M0e0C0i0F0@1h1j1l1n0R3@4s3v1C2 1w0L190v0R25510q0q0!0B0R2p440R0f0x164u4!210 2s0i0~0f0e0m0@050719000A0f1f0s050P474^1D3o2W3~5i1=5l5n5p060t0C1|0V0c0I0g0r050d4L3p4Y0n1+252t5b5d5m0q0x0H0a570t2R0R0y0O0k0H230X0v5$0l1{0(0`1/180A020X0e0k0#2!0(5_0(1`660H0X0t1Q653X0a600I620R5/0h652h0f580,0R2v2)5d0y650R4=0)0!5m0R5)2^6g1Z1n6t0y0k0$1Z590k3|6l625c164?1Y0(0y0v1Y440(2v4B5F5?5H5`5J025q0I5y476k5?2A1i5#582q2s1G1n2C6V020o1A4|020p6p2y0t6A6w1Z640R0k0O0{080#6t4(2s0R2!5m0k6A0I0H6T0+0R0{2s1Z1{2R0m1Z6+4n5G5k6/5o6;07070y5N0P6@4_3I0l0O237w6R5d6T6X6t5#0H6B7I5h6-7L5m7N6=5t5v5x5z7V6u6T5B2 2V3#7K5I7;067R190G0R5M190z0R5T5V4W5X1y024~580e5e0u181/6B6D645!7A0t7C0R7E5n6L6k0R0A0O0x0u0O1/0H6D6x4$7*7%6r7H3}7J7.825p7Q0C0r0G0V7U2,516t2v6P5+185f808T7M8V0U8Z8#2~764{4Y8j527X0l8v6t4=576S5%5e7,1$818/7O5s5u5w8?4t7}1E1G8-5j8U6;845N0R875P6?8e4X8h0!6w180X4@779h5E8S9k9905060K05090e0A2!0J6%1N0I0S0T0K891a1c1e87855S05050K1b1d0j8Z5Q5S9J250l9P1)9S9U5U5W0y2 4W0!0$0'02.

  1. Les illustrations de cette page proviennent d'ici et