Arbre de Collatz

La suite de Syracuse, autrement connue sous le nom de suite de Collatz, est définie de la façon suivante :

  • on choisit comme valeur de départ un entier strictement positif,
  • à chaque étape on calcule une nouvelle valeur en appliquant les règles suivantes :
    • si la valeur actuelle est paire, la nouvelle valeur est égale à sa moitié,
    • sinon, la nouvelle valeur est égale à son triple augmenté de 1.

Exprimé en termes mathématiques, on a donc \(u_0\) un entier strictement positif et pour tout \(n\) entier naturel :

\[u_{n+1}=\begin{cases} \dfrac{u_n}{2}&\text{si } n \text{ est pair}\\ 3u_n+1&\text{sinon }\\ \end{cases}\]

En prenant comme valeur initiale \(u_0=3\) on obtient la succession suivante :

    graph LR
    Q(3) --> R(10)
    R --> A(5)
    A --> B(16)
    B --> C(8)
    C --> D(4)
    D --> E(2)
    E --> F(1)
    F --> D

Comme on peut le voir, lorsque l'on a atteint la valeur \(1\), on rentre dans un cycle \(1\rightarrow 4\rightarrow 2\rightarrow 1\rightarrow \dots\).

Partant de \(3\), il faut calculer sept termes avant d'obtenir \(1\).

Une célèbre conjecture suppose que la suite de Syracuse de n'importe quel entier strictement positif atteint \(1\). Si cette conjecture est vraie, il est possible de construire un arbre enraciné, appelé arbre de Collatz, représentant les trajectoires de différents entiers jusqu'à ce qu'ils atteignent la valeur \(1\).

    graph LR
        R(1)
        A(2)
        B(4)
        C(8)
        D(16)
        subgraph sg1 ["h=5"]
        E(5)
        F(32)
        end
        H(64)
        G(10)
        subgraph sg2 ["h=7"]
        K(21)
        L(128)
        J(20)
        I(3)
        end

        A --- R
        B --- A
        C --- B
        D --- C
        F --- D
        H --- F
        E --- D
        G --- E
        J --- G
        I --- G
        L --- H
        K --- H

L'arbre représenté ci-dessus est de hauteur \(7\), ses feuilles ont pour valeurs \(\left[3;20;21;128\right]\).

La racine de l'arbre a pour valeur \(1\). Les autres nœuds sont obtenus de la façon suivante. Soit \(n\) la valeur d'un nœud :

  • dans tous les cas, ce nœud a pour enfant un nouveau nœud de valeur \(2n\),
  • si de plus, \(n\) est strictement supérieur à \(6\) et si la division euclidienne de \(n\) par \(6\) donne un reste de \(4\), on ajoute un autre enfant de valeur \(\dfrac{n - 1}{3}\).

On demande d'écrire la fonction feuilles qui prend en argument la hauteur de l'arbre souhaité et renvoie la liste triée des valeurs des feuilles de cet arbre.

Les hauteurs passées en argument seront toujours des entiers compris entre \(0\) et \(30\).

Trier une liste

On rappelle qu'il est possible de trier une liste nombres en faisant nombres.sort() (tri en place) ou sorted(nombres) (qui renvoie une nouvelle liste triée contenant les mêmes éléments).

Tri en place
>>> nombres = [2, 0, 1]
>>> nombres.sort()
>>> nombres
[0, 1, 2]
Nouvelle liste
>>> nombres = [2, 0, 1]
>>> sorted(nombres)
[0, 1, 2]
>>> nombres
[2, 0, 1]
Exemples
>>> feuilles(0)
[1]
>>> feuilles(1)
[2]
>>> feuilles(5)
[5, 32]
>>> feuilles(7)
[3, 20, 21, 128]
>>> feuilles(14)
[11, 68, 69, 70, 75, 384, 416, 424, 426, 452, 453, 454, 2560, 2688, 2720, 2728, 2730, 16384]
Aide

Chaque niveau d'indice supérieur ou égal à \(1\) peut être déterminé à partir du niveau précédent.

###(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
.1280135[tf4)2rR3%sa-o iug0x8m1]P6p*Onl7h.e=céy:v9(wq;S/b_dk050!0K0d0n0r0G0m0q0M0G0n0m0m0L010d0r0C010406050m0s0x0x0n0i0O040W0p0G0s0_0p0F0q020n0x0C0V0q0j0K130i0U0s0K0m050X101214160~0C041u1B051E0X1E1G1B0~0!0r0Q0.0:0=0@0I0r0t0I0G1U0I0d0|050)0Y0G0K1P0;0?011T1V1X1V0d1%1)1#0d0Y0p0!161$0i1C0d0I0.190m0C0n0F0@0h011+1R010e0+0K0F1h0K1#26282d1-2g1)2j0x2l040a0q0A0i0p0C0p0m0r1c1e0%240i0i0K0M2G1u2n0F1C0X222S0d201 210!2p0@1X0F2i2D1#1M1O0/1,2$0r2(0F1|1N1#0C2L1C2Q2S2}0 271e2.2e2?0i130G0|0q0y2P310}302o331-3537390h3c283e2Q2#013j0n38040q0k3n2R0~3q3h0@3t3v0q0f3z3p313r3F390b3J3B3L3D3s0p363u390B3Q3f321Q3i3V3k3w0H3!3C3%3E3)3X3w0w3-3S3/3U3W3G0R3^3g3`3N040y0u3J1D2{1u2,2V0!2Z3r0M1|2v0$1N1C2`0K2|3d464f0%4n402/010#0|0%0e463.4u0T394A3_4u0F0e0|0e0K0s0+1)1t1v4o4B2e0{040S4F4t340|0I0n1b4M0i4Y3$4u4V0g0P3Q0q4=0q3#3M0|2?4M0!4Q2}4@4T1-0p0|0L3J504G4U0|0c4+3r0x0r0|3b4R3o4^3T4V0z4;4?5k3`4w040e3V565q4H0|0Z5w510@0p4D042;5B583i0Y0|0i280t0K5c5l0|4X5i2R5x4!044$4(0s4*5V4s4,59044/5o4?5p5C3s4`0p0s0Q0K4%0v5I4Z52545}5*1-4V0c5n5(065/5/5X1-5s5u5%4 6b3E4`613r5E0|5H5(575~6i044{0s4}5R3`4V4:67696C6q626s2?5^5`0s5|5(6h0153040J6x5y040n0C0C2i0!6S5+5U2 5;5e0|3m6p6N6P0D6k3T0F6j6M5;4.5.6D4=6N5s0r4z6,5;6=6t6:3`6P020t0d0V55715J0@6)043Z7d6r6O5F286Z7j6F5=747p6l0|0l754u7g7i6g5;6P0L7c7B7e017g3I6@7H6z6`6{6a725?6I5{6!5 6Q7V6s6V6X0F7o6%7M5T6$4S7H730F7x2e6P0o7:1-7g5h7(7k6_7t3T6P0X0X7@7f5f043y7L7|0|0g7O5:7-5?4|4~3d6E7u047F8i6N7.5@5_7U6B8d7k5s2L0d5$7/7~415L040m3V0d0K7%7,894W7Y7r6u6w887q7}2}0~0X4q4m478Y0X4a1u0d4c8%2X2T1{1}2V0n1(8!4a1A5)3r2L0x0Z0e0n0#0K0Z0I0k0|1m1o1q1s0q6A2 1H3e1B0E1e6X1b0q4%0=0r0q1b0+0r0m0K0i9n2(9j6W2A0M0I1*0i0N0M5$2E5_991D3e2,3r1/1W1Y1!8^3T2r2i2k0|2x0W0M0i0`0d2y0O221d464l5)2~4o8X9R5r4x0K707{7q5F4@8R3M4J5t4M4O1s8N4V7+5j7R5Z4%8H5$a48a9a3d688u7q6~9^8na85!ab6fam7H770G7a837I853P9}5S04af3oah6C6}5M0(8zaw648N7g6+9_8k0D6/aA414#aa4)ad04668U7Q8e6t0p8gaw7DaL5aa#aga%8v4K5v8B6T8A7G7k6m5Ga{ar7k734L4N0G4PaZa65WanaXaca_7;0|7?be7^857`8K8Sae8c6|a88P8ha7as0|6RaU6T7!6Yb8aN85aPb17q6.aw7.aZ8b8taG5;akbJ6?a|bH0|787a8m3o8j3T7za,7m7$bR7sbT8k7wbi840|7AbG8k7Eaw7JaZaD3A7Pai4_a)a+bybf7Xc33i0|bAb)c60@a5b99;a`a,bgb_bkbLch0481cj0|87aQaBbMa$b 3T8waJ0ib0bZ8o8D8F0i8H8Jbu8Lce8o8f6vbtba7)5,3!8W4g2S9,494j8V0%0)0+0m04.