Programme python récursivité

a marqué ce sujet comme résolu.

Bonjour à tous j’ai un programme python que je n’arrive pas à faire si vous pouvez m’aidez svp Le programme consiste à recréer la méthode str count() compter le nb de fois qu’une mette est rencontre dans une chaîne de caractère avec une fonction récursive.

Salut ! On peut t’aider, on est même là pour ça, par contre te donner la solution directement ne t’apporterait pas grand chose. Qu’as-tu tenté, pour le moment ? Quel est ton code actuel ? Où est-ce que tu bloques ? Sur comment faire une fonction récursive ? Ou l’algo lui-même peut-être ?

Avec ces infos, on pourra t’aider de façon pertinente et surtout utile pour toi :) .

Salut,

Sans rien coder comment est-ce que tu ferais pour compter le nombre d’occurrence d’une lettre dans un mot ? -> Essaye d’adapter cela en code.

Ta définition de fonction compter(mots, lettre): est bonne mais en faisant mots="" tu changes la valeur de mots pour le mot vide et tu ne pourras plus compter le nombre de lettres du mot, tu n’as pas besoin de changer la valeur de mots pour compter le nombre d’occurrences d’une lettre.

+1 -0

Salut,

Je ne sais pas exactement sur quoi tu bloque. Si c’est sur du python, je te recommande de revoir quelques bases, sur le site il y a un cours qui comprend cela : https://zestedesavoir.com/tutoriels/799/apprendre-a-programmer-avec-python-3/

Si c’est de l’algorithmique, n’hésite pas avant de programmer d’écrire l’algorithme sur une feuille en langage naturel, avant de le traduire en python. ^^

+0 -0

Lorsque tu postes du codes sur ZDS pense à délimiter ton bloc de code avec les balises ``` pour que cela soit lisible et que l’on puisse avoir l’indentation.

Ton code :

def compter(mots,lettre): 
   nombre=0
   for i in texte:
      if i==letter:
         nombre = nombre + 1 
   return nombre

Déjà il y a une petite erreur ligne 4, tu utilises letter mais il n’existe pas de variable letter, il faut utiliser la variable lettre. De la même manière, à la ligne 3 tu utilise texte alors qu’il n’y a pas de variable texte il faut donc plutôt utiliser mots.

Ensuite c’est bien for i in texte qu’il faut utiliser.

for i in texte va regarder les lettres d’une chaîne de caractère une par une (par exemple for i in "abcb", i aura pour valeur 'a' puis 'b' puis 'c' puis 'b’).

for i in range(len(texte)) va commencer à i = 0 et va s’arrêter quand i aura pour valeur la longueur du texte, il faudra ensuite accéder à la lettre du texte correspondante en utilisant mots[i] dans ce cas-ci. Par exemple for i in range(len("abcb")), i aura pour valeur '0' puis '1' puis '2' puis '3’.

+0 -0
def compter(mots,lettre):
    for i in mots:
        if mots[i]== lettre:
            return lettre= lettre+1

d’accord merci enormément j’ai compris pk faut pas utiliser for i in range(len… mais la du coup c’est ça pour l’instant si j’ai bien compris on a comparé les lettre de mot avec lettre et on return un compteur quand on rencontre lettre ?

En fait tu peux utiliser for i in range(...) ou for i in mots comme tu préfères.

C’est juste que dans le premier cas tu va utiliser l’indice pour accéder à la lettre du mot et comme entwanne l’a fait remarquer ce n’est pas intéressant ici (tu ne fais rien d’autre de ton indice).

En revanche ce que tu fais n’est pas correct, tu ne peux pas parcourir les lettres de ton mot et essayer d’accéder à mots[i] (ligne 3), car ça n’a pas de sens d’accéder à quelque chose comme mots['a'] ici.

À la ligne 4 tu as un problème aussi, tu veux garder un compteur en mémoire (qui compte le nombre de fois que tu as rencontré la lettre) et l’incrémenter lorsque tu rencontres la lettre.

Une fois que tu as parcouru tout le mot (après la boucle for) tu peux retourner ce compteur.

+0 -0

C’est bien de définir une fonction, c’est mieux de l’appeler. A ce moment là, Python va essayer d’exécuter ta fonction. Par exemple :

def compter(mots,lettre):
    for i in mots:
        if mots[i]== lettre:
            return lettre= lettre+1
compter("Zeste de savoir", "e")

Je te conseille de lire les messages de Python et d’essayer de les comprendre.
En l’occurrence, il signale a une erreur de syntaxe, tu n’es pas sorti de l’auberge.
Relis bien ce qu’a écrit Jeph et corrige ton code en conséquence.

+1 -0

edit: non c’es une chaine de caractère que je veut moi pas une liste donc c bien for in in range?

Aminedu21

Non j’ai parlé de liste mais c’est la même chose, le range(len(...)) ne sert à rien.

def compter(mots,lettre):
    for i in mots:
        if mots[i]== lettre:
            return lettre= lettre+1

Aminedu21

i est une variable qui va prendre successivement la valeur de chaque lettre de mots. Par exemple si mots vaut 'abcd' alors i vaudra 'a', puis 'b', puis 'c' et enfin 'd'.

mots[i] ça voudrait dire accéder à mots['a'] par exemple, ça n’a pas de sens.

En fait tu peux utiliser for i in range(...) ou for i in mots comme tu préfères.

Jeph

L’un est une pratique recommandée, l’autre non.

Est-ce que tu as lu un cours de Python comme par exemple le livre Apprendre à programmer avec Python 3 de Gérard Swinnen ?

Est-ce que tu as aussi regardé comment se comportait ta boucle, quelles valeurs prenait i et ce que tu pouvais en faire ?

Edit:

peut etre cela

def compter(mots,lettre):
    for i in mots:
        if mots[0]== lettre:
            return 1+compter(mots[1:],lettre)
        else:
            return compter(mots[1:],lettre)
        

Aminedu21

Ah oui, j’avais oublié l’aspect récursif du problème. Tu peux donc laisser de côté la boucle for qui ne sera pas utile : si tu inspectes le code que tu donnes tu verras qu’il n’y a jamais plus d’une itération de boucle, et que i n’est pas utilisée.

Mais cette dernière remarque me fait dire que je n’ai pas l’impression que tu essaies vraiment ton code. Tu postes du code ici, parfois avec des erreurs de syntaxe, et tu nous demandes de te dire s’il est bon. Mais si tu l’exécutais, tu aurais la réponse directement et tu pourrais continuer d’avancer.

En l’occurrence ton code n’est pas loin de fonctionner, il faut juste traiter correctement le cas de la chaîne vide (cas que tu rencontreras irrémédiablement au bout des appels récursifs). Et supprimer la boucle.

Est-ce que tu as lu un cours de Python comme par exemple le livre Apprendre à programmer avec Python 3 de Gérard Swinnen ?

Tu peux aussi suivre un tutoriel … comme déjà indiqué https://zestedesavoir.com/tutoriels/799/apprendre-a-programmer-avec-python-3/

Mais cette dernière remarque me fait dire que je n’ai pas l’impression que tu essaies vraiment ton code. Tu postes du code ici, parfois avec des erreurs de syntaxe, et tu nous demandes de te dire s’il est bon. Mais si tu l’exécutais, tu aurais la réponse directement et tu pourrais continuer d’avancer.

entwanne

J’ai exactement la même impression.
Je ne connais personne qui ai fait un programme qui marche sans le tester … ne serait-ce que pour savoir si il marche.
Je connais même des tas de gens dont les programmes n’ont jamais marché du premier coup.

+1 -0

La définition de ce que tu cherches à faire est la suivante :

  • Le nombre d’occurrences d’une lettre dans un mot vide ("") est 0.
  • Le nombre d’occurrences d’une lettre ll dans un mot c+xc est : nn + le nombre d’occurrences de la lettre ll dans xc, avec n=1n = 1 si c=lc = l, et sinon 0.

Petite précision sur la notation : c+xc désignera en fait la première lettre d’une chaîne c et tout le reste xc. Si par exemple ma chaine est la suivante : 'abcd', alors mon c c’est 'a' et mon xc c’est 'bcd' (car 'a'+'bcd' = 'abcd' en Python)

Exemple : soit la chaîne 'zeste' et l’on veut trouver le nombre d’occurrence de 'e'.

  • On analyse 'z'+'este', on voit que 'z' != 'e', donc le résultat est : 0 + le nombre d’occurrence de 'e' dans 'este'.
  • On analyse 'e'+'ste'. Cette fois, on tombe sur un 'e' donc le résultat est : 1 + le nombre d’occurrence de 'e' dans 'ste'.
  • et ainsi de suite

Tu vois bien que le résultat se calcule au fur et à mesure qu’on descend la chaîne, en ayant toujours besoin du prochain résultat (récursivité) sauf quand on finit par tomber sur la chaîne vide qui, par définition, a 0 occurrence de la lettre. La somme finale est le nombre d’occurrences final.

Perçois tu le caractère récursif de la définition ? Vois-tu comment cela peut se traduire en code Python de façon assez directe (tu y es presque dans ton code) sans avoir besoin de boucle for ?

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte