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

.128013s3_8èufvIy |n7aêS1me(P24C:jtwi][h)6o;bcdgM/0làqBp.rL-R,$}=+k{95Jxé050O0u0C0p0E0T0b0l0N0T0p0b0b0*010C0E0X010406050b0g0t0t0p0Z0k040r0K0T0g160K0n0l020p0t0X0L0l0$0u1g0Z0V0g0u0b050R1d1f1h1j1b0X041H1O051R0R1R1T1O1b0O0E0i0~1012140H0E0P0H0T1+0H0C19050_0M0T0u1$1113011*1,1.1,0C1@1_1=0C0M0K0O1j1?0Z1P0C0H0~1m0b0X0p0n140x011{1(010h0{0u0n1u0u1=2j2l2q1}2t1_2w0t2y040a0l0w0Z0K0X0K0b0E1p1r0@2h0Z0Z0u0N2T1H2A0n1P0R2f2)0C2d2c2e0O2C141.0n2v2Q1=1Z1#0 1|2?0E2^0n291!1=0X2Y1P2%2)3a1c2k1r2~2r330Z1g0T190s2$3e1a3d2B3g1}3i3k190x3o2l3q2%2=013v0p3l040c3z2(1b3C3t143F3H0y3K3B3e3D3Q190/3T3M3V3O3E0K3j3G190J3!3r3f1%3u3)3w040o3.3N3;3P3?3+040e3T1Q381H2|2,0O2:3D0N292I0?1!1P370u393p424b0@4j3s3|010N0s19030l0i3G0u0g0Z0}0O0=0B0U0~3G0N0g0T0=1F3`3$4q0n190p3T0l3/3D0K190*4U4W3%18040-423{2 010t0E3m4+4P4-4(0A4#4,2r4/4;1I4k4{1}4(0%4`4?4|4:043y4 3A4$4q4^554p4-4}043n5b2(5d4@190)3!063#5h2r0,190@0h4=5v1}0D194V5m4o3:4-0n0h191d2S0u0d0H0N5B5J2r4(0v5U3W190n5Z4%190I4_5H060l5.4V51145x040E5A5H5:563u5#5g5V1}0K5E04330C5 4X6331673%4R044T5H5o5W195+3a5-5/6n6h5}6e5%5e190G6s5K5~6g5;014(0F6b4q4Y044!5`6p3P5N0g5P5R5T6z5|145X6w3h6M6O5S6V52195Y6R5C6L646E4-6G0#6,574~3c6A4(0I0I6:61190+6{6*5O0C5Q6Z6(606T6$6!6*5$6J6A6.6 3E6X726P796B78755!6+7c6S017e7q6)4.585l6?7r6^6`5,6o6A5?2Y0C4A7b3a5{7v6d6f7z7v4(6v7n6c6y7Q767l046D5,1H4m4i437)0R461H0C487.2.2*282a2,0p1^7+461N5I3D2Y0t0d0h0p0,730c191z1B1D1F0l6k4k1U3q1O0!1`0s0/0l0B6N0T1_0C0l0s0.0e0e0%0l0X2v0O2l8t0g3f1m0T0K8c0l0p0g0l10280Z0p0C0K0E2Y0l0W0u8r8z0:0K0H1r0z1q0D0p0k8M8M0h2t3j0=0l1D000{0l0=0_2S4H2k7{0l2V370K0g0i0u0Z8_1E7M7Y1h2S0H1g720;19090v091.820-0n098U09310h0C0k0)0l090h8S0N0-0p0v0n0I0)1r0*9C9E0p4s0x097C3a8z1g0E0}8L108A2Y981`8~0`8t0u0;2-0q2H2H0n8t1Z8=0E0N2u0Y1Q8i040j0T8:3G3)0}962P0b8^0O000K8=0Z8W9e3D9g2f9j9.9m0v0s0S0S090%090(9U4U4G1D9{1q8L2P4A8S902-97999b8Gai3%ak9i8Tan049n0n0das9V3p0l72a3aD979b8U1oaN4qaPam9laT9J090P0u0V0b109@0laVaX3T8z1q8:6K01a.aRa:9n0m9D9F9H0d0n9M0l0#9P9F0s0x0m1s0T0C1x0S0%0S0/ax5H8z0^9c8{a3ae9E8W9,a,4-b69kaoaqatarasauawaY3A8Aa(8P1`0X1na70^90b4bJaSaUaWbw7L0b8T9Z849Z8E0Y0l8k9%0E0;8:8~8^0P0p0P0n8^2k9b8+2@0l0Q3G8J0D0b8zaAa40N0N0u0X0Cab1`2^8A110l2v0N0`129abW0~0H0f8c9~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

.128013s3_8èufvIy |naêS1me(P24C:jtwi][h)o;bcdgMx/0làqBp.rL-R,$}=+k95J{é050M0t0B0o0D0S0b0l0L0S0o0b0b0)010B0D0W010406050b0g0s0s0o0Y0k040q0I0S0g140I0n0l020o0s0W0J0l0#0t1e0Y0U0g0t0b050Q1b1d1f1h190W041F1M051P0Q1P1R1M190M0D0i0|0~10120G0D0N0G0S1)0G0B17050@0K0S0t1!0 11011(1*1,1*0B1=1@1:0B0K0I0M1h1;0Y1N0B0G0|1k0b0W0o0n120w011_1$010h0_0t0n1s0t1:2h2j2o1{2r1@2u0s2w040a0l0v0Y0I0W0I0b0D1n1p0=2f0Y0Y0t0L2R1F2y0n1N0Q2d2%0B2b2a2c0M2A121,0n2t2O1:1X1Z0}1`2;0D2?0n271Y1:0W2W1N2#2%381a2i1p2|2p310Y1e0S170r2!3c183b2z3e1{3g3i170w3m2j3o2#2:013t0o3j040c3x2$193A3r123D3F0x3I3z3c3B3O170-3R1O361F2`2*0M2.3B0L272G0;1Y1N350t373n3Y3+0=3?3q1#1{0+170=0h3Y3L3}120C170l433T3M3C0h171b2Q0t0d0G0L4a3|2}0116040u4m3d453C170n4t3B4q0H0z3R060l4G49444o0n170o3R4I4b4v0I170)4O3p4u4o4q0F4z4c0s0D170R4#4v4q0$4V4J2p4%3k4+4Y174.1G3n4P4n4;4(043l4{3y4W4A170E4E4H4}4X2p3 040h0I0Y4/4Q4K170D5j4~1{0I47042 5o5c3s0K170Y2j0N0t4@2p4q4s532$554$503H5I3{5w124-5v3U4x5T4c4S040*5W4v4=515E1{4B4D5O4F5a4H5K4v4L044N5O5;4o5Y0X5)3N4M0W0W2t0M5~4p175H3a4:3s4M654Z655?5^695k5F174!5_6a5 5t5#5{170!6r4 4?6n6j5*57585O5b3B5Y5!6D5`3f6c6y5p5R6l6f5y042D6d676f6L6i6N66040H6v5q6t6%6p6h3@6o6!6m6Y5Q4w6q6I6.5Y6u6^6z125%526;56040E0E6$5-5a6J3~5z0?0g0Y4y6|6Z6g6U046:6-6}6?7f714c4q6C38190Q3_3=3Z7y0Q3$1F0B3(7D2,2(26282*0o1?7A3$1L5P3B2W0s0d0h0o0+4i0G0c171x1z1B1D0l5,3a1S3o1M0Z1^0r0-0l0A0g0_1@0B0l0r0,0e0e0$0l620n0M2j7}0g3d1k0S0I7)0l0o0g0l0~265A0B0I0D2W0l0V0t0S0S830.0I0G1p0y1o0C0o0k8g8g0h2r3h0:0l1B000_0l0:0@2Q0|0o2i7N0l2T350I0g0i0t0Y8M1C6E4c1f2Q0G1e0B0t0P17090u091,7U0/0n098n092 0h0B0k0(0l090h5A0L0/0o0u0n0H0(1p0)989a0o0L0r0w097638831e0D0{8f0~842W8$1^8R0^7}8?2+0p2F2F0n7}1X8I0D0L2s5}7.7Q0j0S8G3E5h0{8!2N0b8L0M000I8I0Y8p8,4v8.2d8;8?8^0u0r0R0R090$090%9r4O0T8*9Q1o8f2N7d5A8T2+8#8%8)8a9:4o9=8:0o8=8@048_0n0d9}9s4|8=9Xa88#8)8n1mai2pak9@aoaq095C0U0b0~9M0larat3R831o8G7912aFam9^ap0u0m999b9d0d0n9i0l0!9l9b9p0m1q0S0B1v0R0$0R0-a25O830?8*8O9X9,9a8p9FaD1{aYan9_9{9~9|9}9 a1au3y84az8j1^0W1l9#0?8TaW01bca!aqasa 380l0bam9w7W9w880X0l7;9A0D0P8G8R8L0N0o0N0n8L2i8)8B2=0l0O3E8d0C0b831B0D9Y0L0L0t0W0B9)1^2?840 0l2t0L0^108(bp0|0G0f7)9T1V3#0?0^0`04.