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 :

    📋 Texte
    - 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)
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
.128013[(lbsS]et-ph4rd5f1890uma"ov+w7g,_/3=in 6k:)y 2Pc030j0c0d0s0F07090N0Q070s09090E0t0d0F0f0t020H03090q0r0r0s0i0M020a0u070q0*0u0G030C0;0?0^0`0/0f02031a131d0C1a0/0j0F0v0Z0#0%0(0g0F0z0g071r0g0d0-030U08070c1m0$0'0t1q1s1u1s0d1A1C1y0d0i1b0d0g0Z0}090f0s0G0(0O0t1E1o0t0l0W0c0G0s0r0c1y1X1Z1'1G1*1C1-1/0-040N0P0i0u0f0u090F100G0N0S1V0i0i0c0Q27131=0G1b0C1T2k1Q1S1R1z0j1@0(1u0G1,241y1j1l0!1F2u0F2w0G0u2A1y0f2d1b2i2k2O0:1Y282C1(2H0i0@070-0N0m2h2S0.2R1?2U1G2W2Y2!0O2%1Z2(2i2t0t2-0s2Z020N0D2;2j0/2@2+0(2`2|0N0h302?2S2^362!0k3a323c342_0u2X2{2!0I3h2)2T1n2,3m2.2}0y3r333u353w3o2}0n3A3j3C3l3n370o3I2*3K3e020m0p3P3t2D3L3x0m2$142'1e2M132A2n0j1S2s3k0Q2I1:1b3+1c3)2Q3%2=033;0S2N3J3Y0G0-0S0#0G2H0M0B1/0r3a0N3s2^0u0-0E4e4g3k0G08450F2f3a4m3K0,02060L3h0H3i3Q3Y0J450c0l4l3B430l4G47494t4K1(4w064Q422V0-123|2j4u3Y4w0A4J4W2,0-4d4!414D4S0-0L0K3h0N4_4f4R1G4F020F4I4.4{4*0(4T4V4:4+024Z2Q4|550-4(524$4X024-5c540t4w4z5h5d0t0u0x4Y0u0d4)580(5u0-2F5z3X5j461Z494b0c5l3'5s4w4@4.0H4`5U535A0t4~505F2^564.5i595b2'5W5G1G4i020E4k5r5n0r0F0-3V5'5P4=5#3k5C023m5 4v0-4U5|5n445k643Y5/5;6c1(5^5`575-5e024?4^5V6q5(350-2d0;070U5y5?5X6e6g1G6i3T6p6r5s4~0c0X0c6k5$0-5R2O5T6q5V6s2_6u0c6w6y6D5B4j6$6X025I480u0M6O3k5%5m5X6a5*2=5,4h0-0e6(6F3$6=6l5o5f6(6a5N3}5}6n6(5/0w754N5J6-6/654x7i434Y7l4;025g2O6`4n4,7b6|6~5_6G685X5p7w027d6A726a6+4P7B726;5O697n7H6{026}7S3k6 7o1G4'7e6b7W3K5/7V7s6W7Y7M6P7a5S6U7t3R7f6,4a4c7Z6m0567713d7R806:747'7m7%837j0L0b7E5=7+5s6a6v0q6x0s6z6S5U6W4~2d0d0q0i6^2j7?877K6-5L774#797~7|6)8v4/7N858f7Q887P7C4=8c5S133 0c2k2L8W3*1k3,2n2q2l0s1B8Z0C3+0/8,0T0V0X02.