Je "bloque" sur un exercice que j'ai trouvé sur la récursivité. Le but est d'insérer un caractère entre chaque lettre d'un mot avec une fonction récursive prenant comme paramètre le mot et le symbole à placer. Pour moi la récursivité n'est vraiment pas la méthode la plus évidente pour faire ça, surtout en Python, mais bon j'ai tenté de le faire quand même. Je me retrouve avec une fonction qui marche mais qui utilise une variable globale, auriez-vous une idée de comment m'en passer ? Mon code :
res = ""
def inserer_symbole(mot, symbole):
"""Cette fonction insére le symbole entre chaque lettre du mot"""
global res
if mot == "":
return res[:-1]
else:
res += mot[:1] + symbole
return inserer_symbole(mot[1:], symbole)
# En une ligne :
mot, symbole = "test", "*"
mot = "*".join(mot)
Je vous remercie par avance pour votre réponse !
- Edité par TheArcturus 25 septembre 2021 à 10:34:43
J'y avais pensé mais la consigne de l'exercice indique que la fonction doit prendre comme paramètres le symbole et le mot, donc j'imagine que je n'ai pas le droit de rajouter res et que même ma solution avec global ne répond pas exactement à la consigne... Je ne vois pas trop comment faire autrement ^^'
def inserer_symbole(mot, symbole):
"""Cette fonction insére le symbole entre chaque lettre du mot"""
if not hasattr(inserer_symbole, "res"):
inserer_symbole.res = ""
if mot == "":
return inserer_symbole.res[:-1]
else:
inserer_symbole.res += mot[:1] + symbole
return inserer_symbole(mot[1:], symbole)
mot, symbole = "Diablo76", "*"
print(inserer_symbole(mot, symbole))
ça me fait 2 méthodes Est-ce que vous auriez une idée d'une troisième, fonctionnant peut-être même différemment qu'avec mon idée de base, qui n'utiliserait pas de fonctions "avancées" du langage ? (Je veux dire que je connais les lambdas mais je n'ai jamais regardé plus en détail pour le moment, et j'avoue que je ne savais même pas que l'on pouvait faire fonction.attribut (comme le .res) ^^')
def inserer_symbole(mot, symbole):
"""Cette fonction insére le symbole entre chaque lettre du mot"""
if not hasattr(inserer_symbole, "res"):
inserer_symbole.res = ""
for letter in mot:
inserer_symbole.res += letter + symbole
return inserer_symbole(mot[1:], symbole)
return inserer_symbole.res[:-1]
On dirait que tu n'as pas vu ma réponse qui me semble plus simple que les deux auxquelles tu fais allusion : pas d'attribut de fonction, pas de lambdas, pas d'opérateur walrus, pas de décompression. Le code de jos ne répond pas d'ailleurs exactement à la question puisque la fonction appelée n'est pas récursive.
Pour faire plus simple encore, on a :
def inserer_symbole(mot, s):
return mot if len(mot)==1 else mot[0]+s+inserer_symbole(mot[1:], s)
print(inserer_symbole("TEST", "*"))
et si l'expression conditionnelle te gêne tu peux aussi écrire :
def inserer_symbole(mot, s):
if len(mot)==1:
return mot
else:
return mot[0]+s+inserer_symbole(mot[1:], s)
print(inserer_symbole("TEST", "*"))
On dirait que tu n'as pas vu ma réponse qui me semble plus simple que les deux auxquelles tu fais allusion : pas d'attribut de fonction, pas de lambdas, pas d'opérateur walrus, pas de décompression. Le code de jos ne répond pas d'ailleurs exactement à la question puisque la fonction appelée n'est pas récursive.
Oh effectivement je n'avais pas vu ta réponse, désolé ! ^^' Ta réponse est beaucoup plus simple et répond parfaitement à l'énoncé, merci beaucoup ! (l'expression conditionnelle ne me dérange pas)
josmiley a écrit:
Je sais pas, par contre tu peux frimer en classe avec
symbole.join(mot)
Ce n'est pas un exercice que je dois faire en classe, à vrai dire c'est une question que quelqu'un m'a posé, à part de très rare cas on ne me demande plus une certaine méthode pour résoudre un problème Et c'est directement la méthode qui m'est venue, mais cette personne est obligée de le faire par récurrence
Diablo76 a écrit:
Une autre idée, on supprime le if/else :
Il y a toujours le fonction.res et le fait d'enlever if/else rend encore plus difficile la compréhension de cette fonction récursive je trouve
- Edité par TheArcturus 25 septembre 2021 à 14:45:35
def inserer_symbole(mot, s):
if len(mot)==1:
return mot
else:
return mot[0]+s+inserer_symbole(mot[1:], s)
print(inserer_symbole("TEST", "*"))
C'est une solution bien connue qu'on rencontre souvent avec le langage haskell (x: xs) ...
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Insérer symbole entre lettres mot, récursivité
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Python c'est bon, mangez-en.
Découverte Python Doc Tkinter Les chaînes de caractères
Python c'est bon, mangez-en.
Python c'est bon, mangez-en.
Découverte Python Doc Tkinter Les chaînes de caractères
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)