Énumération des permutations⚓︎

On note \(n!\) la factorielle d'un entier naturel \(n\), c'est le produit des nombres entiers strictement positifs qui sont inférieurs ou égaux à \(n\).

\[n! = 1×2×3×4×...×n\]
  • \(0! = 1\), c'est un produit vide, donc égal à \(1\)
  • \(1! = 1\), c'est un produit avec \(1\) comme seul facteur.
  • \(2! = 1×2 = 2\)
  • \(3! = 1×2×3 = 6\)
  • \(4! = 1×2×3×4 = 24\)

La factorielle joue un rôle important en algèbre combinatoire. par exemple, il y a \(n!\) façons différentes de permuter \(n\) objets. Elle apparait dans de nombreuses formules en mathématiques, comme la formule du binôme.

Nombre de façons de placer 10 personnes à table

Par exemple, la factorielle 10 exprime le nombre de combinaisons possibles de placement des 10 convives autour d'une table (on dit la permutation des convives). Le premier convive s'installe sur l'une des 10 places à sa disposition. Chacun de ses 10 placements ouvre 9 nouvelles possibilités pour le deuxième convive, celles-ci 8 pour le troisième, et ainsi de suite.

Il y a \(10! = 3\,628\,800\) façons de placer 10 personnes à table.

Formule récursive

Pour \(i>0\) on a \(i! = (i-1)! × i\), comme on peut le constater sur les exemples

  • \(5! = 1×2×3×4×5 = 4! × 5\)
  • \(6! = 1×2×3×4×5×6 = 5! × 6\)
  • \(7! = 1×2×3×4×5×6×7 = 6! × 7\)

Ceci conduit à une fonction récursive classique

🐍 Script Python
def factorielle(n):
    """Renvoie la factorielle de n positif"""
    if n == 0:
        return 1
    else:
        return n * factorielle(n - 1)

On souhaite calculer \(n!\) et mémoriser dans une liste factorielle_mem les nombres factoriels calculés. Cela permet une utilisation intensive de la fonction, ce qui est souvent le cas en combinatoire. On propose ici une fonction non récursive factorielle dont voici le principe :

  • factorielle_mem est initialisé à [1] de sorte que \(0!\) est égal à factorielle_mem[0]
  • factorielle(n) fait plusieurs actions :
    • Elle remplit, si nécessaire, factorielle_mem avec une boucle.
    • Elle renvoie \(n!\) en utilisant factorielle_mem[n] qui sera donc de taille au moins n + 1 à la fin de l'appel.
    • On utilisera la variable fact_i pour \(i!\)
    • On utilisera la variable fact_im1 pour \((i-1)!\)
Contrainte

Le module math est désactivé pour cet exercice.

Exemples
>>> factorielle(5)
120
>>> factorielle(10)
3628800
###(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
.65038.9875.128013lS]et-dA5!f18umag,_/R=Vin 6)yàqPhc\[(bEsx.p;r4jC'90"ov+w73êOk:é *2030d0a0b0m0u070K0+0E070m0K0K0s0W0b0u0N0W020w030K0k0l0l0m0P0z02080X070k110X0v0+000m0l0N0O0+0r0a1b0P0B0k0a0K030q181a1c1e160N02031J1C1M0q1J160d0u0Y0_0{0}0 0D0u0n0D071!0D0b14030;0I070a1V0|0~0W1Z1#1%1#0b1,1.1*0b0P1K0b0D0_1h0K0N0m0v0 0-0W1:1X0W0h0?0a0v1p0a1*26282d1=2g1.2j0l2l02060+0C0P0X0N0X0K0u1k1m0/240P0P0a0E2G1C2n0v1K0q222S1 21201+0d2p0 1%0v2i2D1*1S1U0`1;2$0u2'0v0X2+1*0N2L1K2Q2S2|17271m2-2e2=0P1b07140+0i2P30152 2o321=3436380-3b283d2Q2#0W3i0m37020+0$3m2R163p3g0 3s3u0+0Q3y3o303q3E380f3I3A3K3C3r0X353t380x3P3e311W3h3U3j3v0#3Z3B3$3D3'3W3v0j3+3R3-3T3V3F0U3?3f3^3M020i0V3}3#2.3_3(0i3a1D3c1N2`1C2+2V0d212!3S0E2?2v0.1T1K2_0a2{4c4b3n034m0/4u3~460v140h0m2N3U0u0a071.0p2u0l3I0+3!3q0X140s4R4T3S13020G3I4Z3^0l0u144a2~3,464#093P0w3Q4C2e0(140/0h4Y4/330h4F4H0b4J4L1.4'501=4#0H593@4D140v5e4_5b140y0)3P0+5q4S5a3D140u4 5f2e4V024X4w2R5s5y3h0I142s5j452e5c5L3L534I0P4K4M0a4O1v5P4!5m5p5r4(464{020!1Z585D3v5'335h5x5k0 5A000n0b0O5C2|5F5@3r5v5Z3^4#5o5.0w5r6a605M3h5R0b0p0u0l4-3c6c4U4W5?6d5u024G5S5U4N4P644:144%5.5:6e025w5.6m3S5A0c6p3q4*4,6y5N144=686b5%5t626s546h6M6J6o6H6D6r6t6g6i6k3n6I3^5A0,6$3 636U6V6:5g6Z6u575W6x6C6X5A0M6Q6E0m0N0N2i0d770 5O735G6*6!6G4.7i0W4#0y5$6V6)6Y7l6l7t5A0Z5~7w6X6O417r6|4`142L0b0k0P5i6(6X4E6~555T705X4Q7h614#6B7m617Q7N7#6q7o6S3Z0q4z4t4d7/0q4g1C0b4i7@2Y2T0m1-7;4g1I4B7)2L0l0p4G0(5W0D0$141u1w1y1A0+672~1P3d1J0e0k0+0d0*0I1j8p8o7.0o4S7.6F1C8z0+1A0b0+1.0+4s4*0a0P0+2:1S0E1/7}0K2i8F2I4y4n7R565V7V8B8Y0M0+0e2:2E8G1/2_0X0E0D0=1m2=0l0I2L0+0A0+0m0R0X1j8L8D0K8F7t1c2F0D1b0b0a0L140F0H0u0g0F7q5.768k810S0:9c8I2A2_0u0*0b0*948F4m0v8T0P0Y0*1/8}0{0+2g2H1/9K0I910`1/8X4A5+2h8%4A0+1s1l8I1c8H3t3U0^0d0T171 1l0n6F0v0Y98280b2P9/0v9;8p1/9Q0k9S9n1Q1L020J1m0K3U111/2Ia19S8x9$0m8y8Y1m00075|8N9Y4t0+3Uak4A6G8C8E8-9t1v4K8M8O0u8Q8~0I8T0v0b8xaH1y0u9t910Y1/8f8G0TaFaH9U4t7Nay959t0*aK0b8(0'1m7b8t9)0P0^0P0*2C0v0d2La43d0D0i8N0d0 aTa=0u1l0c0P4H4m7L0E4K140t8L2E9$b90Ebb0Pbd0a03aj3S0D0a0m0/0P2%4{0+0D2L0h0 01b4bi0vb8ba91bnbe0+110b1.0 0C8L1b2;8Fby1405041C0m2Sa 8l020C1c0h0X0u0^0k2'0+bGb61mbkbmbo8I0a8t0%1 8.1i0^9d0N1%bd9ca}1R1T3q1@1$1'1)823q2r2i2k142x080E5T0N8F0C0z221l4'4s822}4c8z7t7Q6+8!6w5Y7O7n5A7A6/7t7Z7e0W7D6.2RcP7+684^7)5)4}6@4D528Z7T5VcR7g7(5Q027'4c6X7p8i3c696W7n7Q7vcO746'5 cE5I025K7X7)c-c=c|6fcH71cJc.5!029l2|c`5q7t5)9W5-d27P5=cK615_5{5}c%5;8Ad73q667F6acEdcc*cI7Wdg6;149ndM6}797ba`c,145ddC3ScF54dd8$dY656AcRc}dz1=6Kd,0 cTdV026TdrcL146?du7)d+d'6zdidFc{7$6_d^dv147zd/cS4+7E6`dm6X5)7J7Lc;c dbc)6vdedLda7Yd)d dAekcVc?cXdkar2Scz4f4q167=0:0=0@02.