2.4 Problème de blocks
De combien de façon différente peut-on couvrir cases (adjacentes) avec des blocks de couleur jaune, rouge, vert, bleu et violet, si les blocks de couleurs jaune, rouge et vert occupent chacun deux cases, et les blocks de couleur bleu et violet occupent trois cases ? Voici un exemple d’une telle configuration.
La première chose à remarquer est que les options pour le dernier block dépend des blocks qui ont déjà été placé avant lui. Ceci est un indication qu’une récurrence est particulièrement adapté pour résoudre le problème. Pour construire cette récurrence, remarquons que le nombre de suite de blocks de longueur qui se termine avec un block jaune est égal au nombre de suite de blocks de longueur , car pour chacune de ces suites, on peut toujours ajouter un block jaune. Il en est de même pour les suites de blocks se terminant par un block rouge ou un block vert. Pour les suites de blocks de longueur se terminant par un block bleu, il y en a autant que de suite de block de longueur , car pour chacune de ces suites de block on peut toujours ajouter un block bleu, et de même pour les suites se terminant par un block violet. Comme une suite de block de longueur doit obligatoirement se terminer par un block jaune, rouge, vert, bleu ou violet. Ceci peut être visualiser à l’aide du diagramme en arbre suivant:
On obtient donc la récurrence suivante:
Comme cette suite utilise les trois valeurs précédentes, il nous faut donc trois valeurs initiales, ce qui peut facilement être obtenu par énumération. On a donc:
On peut alors utiliser le code Python suivant pour compléter un tableau de valeurs.
1 from sympy import *2 from pandas import *3 init_printing()45 def x(n):6 if n == 1:7 return 08 if n == 2:9 return 310 if n == 3:11 return 212 else:13 return 3*x(n-2) + 2*x(n-3)1415 tableau = DataFrame([[x(n) for n in range(1,11)]])16 tableau.columns = [n for n in range(1,11)]17 tableau.index = ["Valeurs"]18 tableau
Ce qui nous permet d’obtenir automatiquement le tableau suivant:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
| 0 | 3 | 2 | 9 | 12 | 31 | 54 | 117 | 224 | 459 |
Il y a donc un total de suites de blocks possible qui forment une chaîne de longueur . Il est aussi possible de trouver une formule explicite pour ce problème, ce que nous ferons plus tard. Pour le moment, vous pouvez utiliser l’induction pour démontrer que la récurrence satisfait la formule explicite suivante:
À partir de la formule explicite, il est à nouveau possible d’utiliser Python pour retrouver les différentes valeurs de notre tableau.
1 from sympy import *2 from pandas import *3 init_printing()45 def x(n):6 return Rational(4,9) * 2**n + Rational(5,9) * (-1)**n + Rational(1,3) * n * (-1)**n78 tableau = DataFrame([[x(n) for n in range(1,11)]])9 tableau.columns = [n for n in range(1,11)]10 tableau.index = ["Valeurs"]11 tableau