Suite de Hofstadter-Conway

On connaît bien la suite de Fibonacci dans laquelle chaque terme d'indice \(n \ge 2\) est égal à la somme des deux termes précédents :

\[F_n = F_{n-1}+F_{n-2}\]

On s'intéresse dans cet exercice à une autre suite récurrente, un peu plus subtile, la suite de Hofstadter-Conway qui est définie par \(a_1 = a_2 = 1\) et, pour tout \(n \ge 3\) :

\[a_n = a_{a_{n-1}} + a_{n-a_{n-1}}\]

On remarque que le calcul de \(a_n\) fait intervenir le terme précédent, \(a_{n-1}\), en tant qu'indice. Pour calculer \(a_n\), il faut en effet additionner :

  • le terme d'indice \(a_{n-1}\)

  • et le terme d'indice \(n-a_{n-1}\).

On garantit que, pour tout entier naturel \(n\), on a \(n-a_{n-1}>0\).

Les premiers termes sont les suivants :

Rang \(n\) \(1\) \(2\) \(3\) \(4\) \(5\) \(6\) \(7\)
Valeur \(a_n\) \(a_1=1\) \(a_2=1\) \(a_3=2\) \(a_4=2\) \(a_5=3\) \(a_6=4\) \(a_7=4\)

Le calcul de \(a_7\) fait donc intervenir \(a_6=4\) en effectuant la somme de \(a_{a_6}=a_4\) et de \(a_{7-a_6}=a_{7-4}=a_{3}\). On obtient ainsi \(a_7=a_4+a_3=4\).

Écrire une fonction suite_hc prenant en paramètre un entier n > 0 et renvoyant le n-ième terme de la suite de Hofstadter-Conway.

Exemples
>>> suite_hc(1)
1
>>> suite_hc(2)
1
>>> suite_hc(3)
2
>>> suite_hc(4)
2

Dans cette version, les tests se limitent à de petites valeurs de \(n\), inférieures à \(100\). On pourra donc utiliser une approche récursive sans craindre de dépasser la profondeur de récursivité maximale (le plus souvent limitée à 1000 par défaut).

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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 : 10/10

.128013:LpJM(40ed3; 1j}o5_ên)Bh]6,qc$[yCuvà8i2+xms7=wlSIatf-9{R|rg.éPkbè/050k0j0Z0Y0M0V0R0n0D0V0Y0R0R0T010Z0M0d010406050R0I0Q0Q0Y0*0G040W0r0V0I160r0v0n020Y0Q0d0m0n0(0j1g0*0C0I0j0R050=1d1f1h1j1b0d041H1O051R0=1R1T1O1b0k0M0J0~1012140y0M0+0y0V1+0y0Z19050_0:0V0j1$1113011*1,1.1,0Z1@1_1=0Z0:0r0k1j1?0*1P0Z0y0~1m0R0d0Y0v140N011{1(010!0{0j0v1u0j1=2j2l2q1}2t1_2w0Q2y040a0n0.0*0r0d0r0R0M1p1r0@2h0*0*0j0D2T1H2A0v1P0=2f2)0Z2d2c2e0k2C141.0v2v2Q1=1Z1#0 1|2?0M2^0v291!1=0d2Y1P2%2)3a1c2k1r2~2r330*1g0V190o2$3e1a3d2B3g1}3i3k190N3o2l3q2%2=013v0Y3l040l3z2(1b3C3t143F3H0h3K3B3e3D3Q190s3T3M3V3O3E0r3j3G190A3!3r3f1%3u3)3w040S3.3N3;3P3?3+040L3T1Q381H2|2,0k2:3D0D292I0?1!1P370j393p424b0@4j3s3|010D0o19030n0J3G0j0I0*0}0k0-0p0K0~3G0D0I0V0-1F3`3$4q0v190Y3T0n3/3D0r190T4U4W3%18040%423{2 010Q0M3m4+4P4-4(0b4#4,2r4/4;1I4k4{1}4(0B4`4?4|4:043y4 3A4$4q4^554p4-4}043n5b2(5d4@190q3!063#5h2r0/190@0!4=5v1}0U194V5m4o3:4-0v0!191d2S0j0t0y0D5B5J2r4(0g5U3W190v5Z4%190w4_5H060n5.4V51145x040M5A5H5:563u5#5g5V1}0r5E04330Z5 4X6331673%4R044T5H5o5W195+3a5-5/6n6h5}6e5%5e190F6s5K5~6g5;014(0z6b4q4Y044!5`6p3P5N0I5P5R5T6z5|145X6w3h6M6O5S6V52195Y6R5C6L646E4-6G0#6,574~3c6A4(0w0w6:61190O6{6*5O0Z5Q6Z6(606T6$6!6*5$6J6A6.6 3E6X726P796B78755!6+7c6S017e7q6)4.585l6?7r6^6`5,6o6A5?2Y0Z4A7b3a5{7v6d6f7z7v4(6v7n6c6y7Q767l046D5,1H4m4i437)0=461H0Z487.2.2*282a2,0Y1^7+461N5I3D2Y0Q0t0!0Y0/730l191z1B1D1F0n6k4k1U3q1O0c1`0o0s0n0p6N0V1_0Z0n0o0$0L0L0B0n0d2v0k2l8t0I3f1m0V0r8c0n0Y0I0n10280*0Y0Z0r0M2Y0n0x0j8r8z0e0r0y1r0H1q0U0Y0G8M8M0!2t3j0-0n1D000{0n0-0_2S4H2k7{0n2V370r0I0J0j0*8_1E7M7Y1h2S0y1g720P19090g091.820%0v098U09310!0Z0G0q0n090!8S0D0%0Y0g0v0w0q1r0T9C9E0Y4s0N097C3a8z1g0M0}8L108A2Y981`8~0`8t0j0P2-0u2H2H0v8t1Z8=0M0D2u0,1Q8i040X0V8:3G3)0}962P0R8^0k000r8=0*8W9e3D9g2f9j9.9m0g0o0i0i090B090E9U4U4G1D9{1q8L2P4A8S902-97999b8Gai3%ak9i8Tan049n0v0tas9V3p0n72a3aD979b8U1oaN4qaPam9laT9J090+0j0C0R109@0naVaX3T8z1q8:6K01a.aRa:9n0)9D9F9H0t0v9M0n0#9P9F0o0N0)1s0V0Z1x0i0B0i0sax5H8z0^9c8{a3ae9E8W9,a,4-b69kaoaqatarasauawaY3A8Aa(8P1`0d1na70^90b4bJaSaUaWbw7L0R8T9Z849Z8E0,0n8k9%0M0P8:8~8^0+0Y0+0v8^2k9b8+2@0n0f3G8J0U0R8zaAa40D0D0j0d0Zab1`2^8A110n2v0D0`129abW0~0y0;8c9~8h1b7,0^0`0|04.

Dans cette version, les valeurs de \(n\) peuvent être grandes, jusqu'à \(100~000\). Une approche récursive ne fonctionnera donc pas du fait d'une profondeur de récursivité trop importante.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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 : 10/10

.128013:LpJM(40ed3; 1j}o5_ên)Bh],qc$[yCuvà8i2+xms=wlSIatf-9{R|rg.éPkbè/050k0j0X0W0L0T0Q0n0C0T0W0Q0Q0R010X0L0d010406050Q0H0P0P0W0(0F040U0r0T0H140r0v0n020W0P0d0m0n0$0j1e0(0B0H0j0Q050:1b1d1f1h190d041F1M051P0:1P1R1M190k0L0I0|0~10120y0L0)0y0T1)0y0X17050@0.0T0j1!0 11011(1*1,1*0X1=1@1:0X0.0r0k1h1;0(1N0X0y0|1k0Q0d0W0v120M011_1$010Y0_0j0v1s0j1:2h2j2o1{2r1@2u0P2w040a0n0,0(0r0d0r0Q0L1n1p0=2f0(0(0j0C2R1F2y0v1N0:2d2%0X2b2a2c0k2A121,0v2t2O1:1X1Z0}1`2;0L2?0v271Y1:0d2W1N2#2%381a2i1p2|2p310(1e0T170o2!3c183b2z3e1{3g3i170M3m2j3o2#2:013t0W3j040l3x2$193A3r123D3F0h3I3z3c3B3O170s3R1O361F2`2*0k2.3B0C272G0;1Y1N350j373n3Y3+0=3?3q1#1{0-170=0Y3Y3L3}120S170n433T3M3C0Y171b2Q0j0t0y0C4a3|2}0116040g4m3d453C170v4t3B4q0w0b3R060n4G49444o0v170W3R4I4b4v0r170R4O3p4u4o4q0E4z4c0P0L170i4#4v4q0A4V4J2p4%3k4+4Y174.1G3n4P4n4;4(043l4{3y4W4A170z4E4H4}4X2p3 040Y0r0(4/4Q4K170L5j4~1{0r47042 5o5c3s0.170(2j0)0j4@2p4q4s532$554$503H5I3{5w124-5v3U4x5T4c4S040N5W4v4=515E1{4B4D5O4F5a4H5K4v4L044N5O5;4o5Y0*5)3N4M0d0d2t0k5~4p175H3a4:3s4M654Z655?5^695k5F174!5_6a5 5t5#5{170Z6r4 4?6n6j5*57585O5b3B5Y5!6D5`3f6c6y5p5R6l6f5y042D6d676f6L6i6N66040w6v5q6t6%6p6h3@6o6!6m6Y5Q4w6q6I6.5Y6u6^6z125%526;56040z0z6$5-5a6J3~5z0?0H0(4y6|6Z6g6U046:6-6}6?7f714c4q6C38190:3_3=3Z7y0:3$1F0X3(7D2,2(26282*0W1?7A3$1L5P3B2W0P0t0Y0W0-4i0y0l171x1z1B1D0n5,3a1S3o1M0c1^0o0s0n0p0H0_1@0X0n0o0!0K0K0A0n620v0k2j7}0H3d1k0T0r7)0n0W0H0n0~265A0X0r0L2W0n0x0j0T0T830e0r0y1p0G1o0S0W0F8g8g0Y2r3h0+0n1B000_0n0+0@2Q0|0W2i7N0n2T350r0H0I0j0(8M1C6E4c1f2Q0y1e0X0j0O17090g091,7U0#0v098n092 0Y0X0F0q0n090Y5A0C0#0W0g0v0w0q1p0R989a0W0C0o0M097638831e0L0{8f0~842W8$1^8R0^7}8?2+0u2F2F0v7}1X8I0L0C2s5}7.7Q0V0T8G3E5h0{8!2N0Q8L0k000r8I0(8p8,4v8.2d8;8?8^0g0o0i0i090A090D9r4O0J8*9Q1o8f2N7d5A8T2+8#8%8)8a9:4o9=8:0W8=8@048_0v0t9}9s4|8=9Xa88#8)8n1mai2pak9@aoaq095C0B0Q0~9M0narat3R831o8G7912aFam9^ap0g0%999b9d0t0v9i0n0Z9l9b9p0%1q0T0X1v0i0A0i0sa25O830?8*8O9X9,9a8p9FaD1{aYan9_9{9~9|9}9 a1au3y84az8j1^0d1l9#0?8TaW01bca!aqasa 380n0Qam9w7W9w880*0n7;9A0L0O8G8R8L0)0W0)0v8L2i8)8B2=0n0f3E8d0S0Q831B0L9Y0C0C0j0d0X9)1^2?840 0n2t0C0^108(bp0|0y0/7)9T1V3#0?0^0`04.