Dans une grille de taille \(n×m\), on souhaite compter tous les chemins allant du coin inférieur gauche (au Sud-Ouest) repéré par \((0, 0)\) vers le coin
supérieur droit (au Nord-Est) repéré par \((n, m)\).
Un point repéré par la position \((n, m)\) a donc pour coordonnées \((n, m)\) dans un repère ayant pour origine le point situé en bas à gauche de la grille.
Les seuls mouvements autorisés sur la grille sont :
Aller au Nord (↑) d'une unité.
Aller à l'Est (→) d'une unité.
Les chemins pour aller de \((0, 0)\) à \((4, 3)\)
Ceux obtenus en venant du sud \((4, 2)\), il y en a 15.
Ceux obtenus en venant de l'Ouest \((3, 3)\), il y en a 20.
Écrire une fonction nb_chemins qui prend en paramètres deux entiers n et m. (n, m) est un tuple donnant une position sur la grille.
Cette fonction 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 deux catégories :
ceux qui venaient de (n - 1, m ),
ceux qui venaient de (n , m - 1),
ces deux catégories sont distinctes et se comptent bien par récursivité.
On utilisera un dictionnaire pour mémoriser les résultats intermédiaires.
# Tests
(insensible à la casse)(Ctrl+I)