Nombres de Delannoy

Dans une grille de taille \(n×m\), on souhaite compter tous les chemins allant du coin inférieur gauche (au Sud-Ouest) vers le coin supérieur droit (au Nord-Est).

Les seuls mouvements autorisés sont :

  • ↑ Aller au Nord d'une unité.
  • → Aller à l'Est d'une unité.
  • ↗ Aller au Nord-Est en diagonale, sur le prochain nœud.

Les chemins pour aller de \((0, 0)\) à \((3, 3)\)

Écrire une fonction delannoy qui prend en paramètres deux entiers n et m et renvoie le nombre de chemins allant de \((0, 0)\) jusqu'à \((n, m)\).

Pour ce faire, on remarquera :

  • Si n ou m est nul,
  • alors le seul chemin est en ligne droite, la réponse est 1,
  • sinon : -n et m sont non nuls et les chemins qui vont en (n, m) se répartissent en trois catégories :

    • ceux qui venaient de (n - 1, m ),
    • ceux qui venaient de (n , m - 1),
    • ceux qui venaient de (n - 1, m - 1),
  • ces trois catégories sont distinctes et se comptent bien par récursivité.

  • On utilisera un dictionnaire pour mémoriser les résultats intermédiaires.

Exemples
>>> delannoy(3, 3)
63
>>> delannoy(2, 1)
5

Compléter le code :

###(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,n w-5e9(]38m=0p)rhk[uoiscb/6S1vt_dg:ay24P+fl7050J0h0H0M0y0T0z0d0A0T0M0z0z0o010H0y0q010406050z0w0n0n0M0s0N040E0x0T0w0/0x0c050C0_0{0}0 0@0q04181f051i0C1i1k1f0@0J0y0G0%0)0+0-0t0y0K0t0T1y0t0H0=050Y0B0T0h1t0*0,011x1z1B1z0H1H1J1F0H0B0x0J0 1G0s1g0H0t0%120z0q0M0c0-0O011L1v010S0!0h0c0M0n0h1F1-1/1@1N1`1J1}1 0=0a0d0Q0s0x0q0x0z0y150c0d0W1+0s0s0h0A2k18220c1g0C1)2x0H1%1$1(0J240-1B0c1|2h1F1q1s0(1M2H0y2J0c1Z1r1F0q2q1g2v2x2#0^1.2l2P1^2U0s0|0T0=0d0F2u2)0?2(232+1N2-2/2;0O2@1/2_2v2G012~0M2:040d0l322w0@352|0-383a0d0P3e342)363k2;0g3o3g3q3i370x2.392;0D3v2`2*1u2}3A2 3b0U3F3h3I3j3K3C3b0m3O3x3Q3z3B3l0i3W2{3Y3s040F0p3%3H2Q3Z3L0F2?192^1h2Z182N2A0J2E360A1Z201g3}1j3{2%3^3305420W2!3X3:0c0=0W0)0c2U0N0I1 0n3o0d3G360x0=0o4s4u3y0c0B4j0y2s3o4A3Y0;040j0r3v063w3(3:0u4j0h0S4H3P3:0e2;4X4g2,0S4U4l4n4$4R1^4K0j4-3/2,0=174a2w4I3:4K0b4z4Y4@044r4`4f4.1N4K0r0L3v0d5d4t511N4T040y4W555f4%580=4;554|524_2%5g0-4~505o3j0=545w5B01595A570-0x4!042U0H5J4?1N5M0=2S5R3r4*1/4n4p0h5E3_5x5H0=5b55065e5:5n5K015i5k5X3y4:4=5Y5O5`3Y4w040o4y5m5t1N0n0y0=3-5s5*5I665*5U043A604}5q5}4B5D6l1^62646r686a046c5F5?595-2#5/5;6G675C042q0_0T0Y5Q6g5G6t6v0-690=3@6E6G5d6I5@0=0h0#0h6o4J5,5c6Z5:6#4i6K0h6M6O6T016S6Q5?6=4k5!0x0N6+6m4L745u6`620f6`6V3+775p044 6}5S6J5(4b6e0=4N7j4v0=0R6`6 6(71736d5G5|7A6~4^7f5y0=7i2#5=7k376q7r3y7a7c6x6X5)7B7p797t7v5Z4m727G5+767D7M6=5v2^7L7s047b7P3Y7d7U7n7W7h7!537Y7=7S6W7(6f6Y6Z6;7#5#4q840=0v5r6A7,7F7+365z7@4h7O8g8k7p0k80657K886?6^0M6P866!5*5i2q0H0w0s7.337:6p04707$4o8b8j5{8d8f7V7E5 8S6,7}8m527m4{7o040r8s5.184d0h2x2Y8;3|1r3~2A2C2y1Y1!2A0M1I8@0C3}0@940X0Z0#04.