Nombre encadré⚓︎
Exercice
Écrire une fonction récursive encadre
qui permette d'obtenir [[[42]]]
par exemple, avec comme paramètres : le contenu
(ici, quarante-deux) et l'epaisseur
de l'encadrement (ici, trois). On voudrait pouvoir obtenir aussi [[[[[1337]]]]]
.
- Allez-vous utiliser
print
oureturn
? - Quels seront les types de vos paramètres, et de la sortie ?
Indice
Pour afficher un texte
sans aller à la ligne, on peut écrire print(texte, end="")
###
Réponse
🐍 Script Python
def encadre(contenu: str, epaisseur: int) -> None:
"""Affiche le contenu avec une epaisseur de []"""
if epaisseur == 0:
print(contenu, end="")
else:
print("[", end="")
encadre(contenu, epaisseur - 1)
print("]", end="")
- Cette solution est correcte,
- elle peut s'utiliser avec
encadre(42, 3)
ou bien mieux avecencadre("42", 3)
- mais il n'y a pas de retour à la ligne une fois fini,
- et surtout, on ne peut pas réutiliser le résultat affiché dans une autre fonction.
Il vaut mieux une autre solution, qui renvoie le texte, que l'on affichera à part !
Bonne pratique : observez l'annotation des types, dans les cas simples, il faut se forcer à l'utiliser !
🐍 Script Python
def encadre(contenu: str, epaisseur: int) -> str:
"""Renvoie le contenu encadré d'une épaisseur de []"""
if epaisseur == 0:
return contenu
else:
return "[" + encadre(contenu, epaisseur - 1) + "]"
- Meilleure solution,
- le résultat peut être remobilisé ou être affiché. Exemple :
🐍 Console Python
>>> encadre("On peut utiliser " + encadre("la fonction encadre", 3)+ " de manière plus complexe.", 2)
[[On peut utiliser [[[la fonction encadre]]] de manière plus complexe.]]
Il n'était pas possible de faire cela avec la version print
.
🐍 Script Python
def encadre(contenu: str, epaisseur: int) -> str:
"""Renvoie le contenu encadré d'une épaisseur de []"""
if epaisseur == 0:
return contenu
else:
return encadre("[" + contenu + "]", epaisseur - 1)
Variante correcte avec une différence fondamentale :
- en dehors du cas de base, l'appel récursif est la dernière instruction de la fonction,
- on appelle cette technique fonction récursive terminale,
- Python n'en tire pas profit, et ne le fera jamais,
- mais d'autres langages de programmation en tirent profit,
- ils transforment le code automatiquement en code itératif qui peut consommer beaucoup moins de mémoire,
- ceci est étudié en post BAC.