2 votes

IndexError : String Index hors de portée pour la fonction récursive

J'apprends donc le python et j'essaie de compter le nombre de voyelles dans une phrase. J'ai trouvé comment le faire en utilisant la fonction count() et une itération mais maintenant j'essaie de le faire en utilisant la récursion. Lorsque j'essaie la méthode suivante, je reçois une erreur "IndexError : string index out of range". Voici mon code.

sentence = input(": ")

def count_vowels_recursive(sentence):
    total = 0
    if sentence[0] == "a" or sentence[0] == "e" or sentence[0] == "i" or sentence[0] == "o" or sentence[0] == "u":
        total = total + 1 + count_vowels_recursive(sentence[1:])
    else:
        total = total + count_vowels_recursive(sentence[1:])   
    return the_sum

print(count_vowels_recursive(sentence))

Voici mes deux solutions précédentes.

def count_vowels(sentence):
    a = sentence.count("a")
    b = sentence.count("e")
    c = sentence.count("i")
    d = sentence.count("o")
    e = sentence.count("i")
    return (a+b+c+d+e)

def count_vowels_iterative(sentence):
    a_ = 0
    e_ = 0
    i_ = 0
    o_ = 0
    u_ = 0
    for i in range(len(sentence)):
        if "a" == sentence[i]:
            a_ = a_ + 1
        elif "e" == sentence[i]:
            e_ = e_ + 1
        elif "i" == sentence[i]:
            i_ = i_ + 1
        elif "o" == sentence[i]:
            o_ = o_ + 1
        elif "u" == sentence[i]:
            u_ = u_ + 1
        else:
            continue
    return (a_ + e_ + i_ + o_ + u_)

2voto

Daniel Roseman Points 199743

Vous n'avez pas de cas de base. La fonction va continuer à récurer jusqu'à ce que sentence est vide, auquel cas votre première instruction if provoquera cette erreur d'index.

Vous devez tout d'abord vérifier si la phrase est vide, et si c'est le cas, renvoyer 0.

1voto

schwobaseggl Points 31215

Vous pouvez raccourcir un peu les choses :

def count_vowels_recursive(sentence):
    # this base case is needed to stop the recursion
    if not sentence:  
        return 0
    # otherwise, sentence[0] will raise an exception for the empty string
    return (sentence[0] in "aeiou") + count_vowels_recursive(sentence[1:])
    # the boolean expression `sentence[0] in "aeiou"` is cast to an int for the addition

1voto

Ajax1234 Points 42210

Vous pouvez essayer ceci :

def count_vowels_recursive(s, count):
   if not s:
      return count
   else:
       new_count = count
       if s[0] in ["a", "e", "i", "o", "u"]:
          new_count += 1
       return count_vowels_recursive(s[1:], new_count)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X