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
.12801342ny6g3p )rPv1-=oa_ckmiu5(,e:ts]Shl970w+bf8[/d050U0C0E0s0x0J0F0j0u0J0s0F0F0q010E0x0i010406050F0y0w0w0s0l0e040H0r0J0y0/0r0d050T0_0{0}0 0@0i04181f051i0T1i1k1f0@0U0x0n0%0)0+0-0I0x0g0I0J1y0I0E0=050Y0P0J0C1t0*0,011x1z1B1z0E1H1J1F0E0P0r0U0 1G0l1g0E0I0%120F0i0s0d0-0c011L1v010Q0!0C0d0s0w0C1F1-1/1@1N1`1J1}1 0=0a0j0m0l0r0i0r0F0x150d0j0W1+0l0l0C0u2k18220d1g0T1)2x0E1%1$1(0U240-1B0d1|2h1F1q1s0(1M2H0x2J0d1Z1r1F0i2q1g2v2x2#0^1.2l2P1^2U0l0|0J0=0j0o2u2)0?2(232+1N2-2/2;0c2@1/2_2v2G012~0s2:040j0h322w0@352|0-383a0j0b3e342)363k2;0z3o3g3q3i370r2.392;0f3v2`2*1u2}3A2 3b0L3F3h3I3j3K3C3b0R3O3x3Q3z3B3l0K3W2{3Y3s040o0M3%3H2Q3Z3L0o2?192^1h2Z182N2A0U2E360u1Z201g3}1j3{2%3^3305420W2!3X3:0d0=0W0)0d2U0e0t1 0w3o0j3G360r0=0q4s4u3y0d0P4j0x2s3o4A3Y0;040A0k3v063w3(3:0v4j0C0Q4H3P3:0N2;4X4g2,0Q4U4l4n4$4R1^4K0A4-3/2,0=174a2w4I3:4K0B4z4Y4@044r4`4f4.1N4K0k0D3v0j5d4t511N4T040x4W555f4%580=4;554|524_2%5g0-4~505o3j0=545w5B01595A570-0r4!042U0E5J4?1N5M0=2S5R3r4*1/4n4p0C5E3_5x5H0=5b55065e5:5n5K015i5k5X3y4:4=5Y5O5`3Y4w040q4y5m5t1N0w0x0=3-5s5*5I665*5U043A604}5q5}4B5D6l1^62646r686a046c5F5?595-2#5/5;6G675C042q0_0J0Y5Q6g5G6t6v0-690=3@6E6G5d6I5@0=0C0#0C6o4J5,5c6Z5:6#4i6K0C6M6O6T016S6Q5?6=4k5!0r0e6+6m4L745u6`620p6`6V3+775p044 6}5S6J5(4b6e0=4N7j4v0=0O6`6 6(71736d5G5|7A6~4^7f5y0=7i2#5=7k376q7r3y7a7c6x6X5)7B7p797t7v5Z4m727G5+767D7M6=5v2^7L7s047b7P3Y7d7U7n7W7h7!537Y7=7S6W7(6f6Y6Z6;7#5#4q840=0S5r6A7,7F7+365z7@4h7O8g8k7p0G80657K886?6^0s6P866!5*5i2q0E0y0l7.337:6p04707$4o8b8j5{8d8f7V7E5 8S6,7}8m527m4{7o040k8s5.184d0C2x2Y8;3|1r3~2A2C2y1Y1!2A0s1I8@0T3}0@940X0Z0#04.