Entiendo que la recursividad es cuando una función se llama a sí mismo, sin embargo no puedo averiguar exactamente cómo obtener mi función para llamar a sí mismo para obtener los resultados deseados. Necesito simplemente contar las vocales en la cadena dada a la función.

def recVowelCount(s):
    'return the number of vowels in s using a recursive computation'
    vowelcount = 0
    vowels = "aEiou".lower()
    if s[0] in vowels:
        vowelcount += 1
    else:
        ???

Se me ocurrió esta en la final, gracias a la penetración de aquí.

def recVowelCount(s):
'return the number of vowels in s using a recursive computation'
vowels = "aeiouAEIOU"
if s == "":
    return 0
elif s[0] in vowels:
    return 1 + recVowelCount(s[1:])
else:
    return 0 + recVowelCount(s[1:])
No utilice una else bloque. Usted necesita recurse independientemente.
Ok voy a ver lo que me puede venir para arriba con.
La tarea de la etiqueta ha sido desaprobado; por favor, no lo use. Si usted piensa que es importante, mencionar la tarea en cuestión por sí mismo. 🙂

OriginalEl autor Daniel Love Jr | 2012-10-13

5 Comentarios

  1. 6

    Probar esta, es una solución simple:

    def recVowelCount(s):
        if not s:
            return 0
        return (1 if s[0] in 'aeiouAEIOU' else 0) + recVowelCount(s[1:])

    Toma en cuenta el caso cuando las vocales están en mayúsculas o minúsculas. Podría no ser la manera más eficiente para recorrer recursivamente una cadena (porque cada llamada recursiva se crea un nuevo rodajas de cadena), pero es fácil de entender:

    • Caso Base: si la cadena está vacía, entonces tiene cero vocales.
    • Paso recursivo: si el primer carácter es una vocal se añade 1 a la solución, de lo contrario agregar 0. De cualquier manera, avanzar en la recursividad quitando el primer carácter y continuar recorriendo el resto de la cadena.

    El segundo paso, finalmente, reducir la cadena de longitud cero, por lo tanto termina la recursividad. Como alternativa, el mismo procedimiento puede aplicarse en el uso de la recursividad de cola – no es que hace alguna diferencia en cuanto a rendimiento, dado que CPython no implementar la cola de la eliminación de la recursión.

    def recVowelCount(s):
        def loop(s, acc):
            if not s:
                return acc
            return loop(s[1:], (1 if s[0] in 'aeiouAEIOU' else 0) + acc)
        loop(s, 0)

    Sólo por diversión, si se elimina la restricción de que la solución tiene que ser recursivo, esta es la forma en que me gustaría solucionar:

    def iterVowelCount(s):
        vowels = frozenset('aeiouAEIOU')
        return sum(1 for c in s if c in vowels)

    De todos modos esto funciona:

    recVowelCount('murcielago')
    > 5
    
    iterVowelCount('murcielago')
    > 5
    +1 no se Puede resistir a votar este. 🙂
    He copiado su if aunque en mi código 😉
    hombre yo deseo que yo tenía de desbordamiento de pila para hacer mi tarea cuando estaba en el colegio 😛 … +1 para la gran respuesta
    en realidad, recVowelCount no «funciona» (tratar de recVowelCount('a'*1000))
    Que Python culpa, no la del algoritmo. Aunque es posible incremento de la profundidad de la recursión y el algoritmo puede ser reescrito para ser cola-recursivo, eso no cambia el hecho de que Python no optimizar la cola de llamadas eliminación. Todos los algoritmos recursivos de tamaño lo suficientemente grande como en Python está condenada al fracaso.

    OriginalEl autor Óscar López

  2. 3

    Su función, probablemente necesita mirar en general como esta:

    • si la cadena está vacía, devuelve 0.
    • si la cadena no está vacía y el primer carácter es una vocal, devuelve 1 + el resultado de una llamada recursiva en el resto de la cadena
    • si la cadena no está vacía y el primer carácter no es una vocal, devolver el resultado de una llamada recursiva en el resto de la cadena.
    +1 por no hacer su tarea para él 🙂
    Este comentario fue la más útil, yo no copia a nadie del trabajo.

    OriginalEl autor Amber

  3. 1

    Uso de la rebanada para quitar 1er carácter de prueba y la de los demás. Usted no necesita un bloque else debido a que usted necesita llamar a la función de cada caso. Si la pones en el bloque else, entonces no va a ser llamado, cuando el último carácter es vocal: –

    ### Improved Code
    
    def recVowelCount(s):
        'return the number of vowels in s using a recursive computation'
    
        vowel_count = 0 
        # You should also declare your `vowels` string as class variable  
        vowels = "aEiou".lower()
    
        if not s:
            return 0
    
        if s[0] in vowels:
            return 1 + recVowelCount(s[1:])
    
        return recVowelCount(s[1:])
    
    # Invoke the function
    print recVowelCount("rohit")   # Prints 2

    Esto llamará su función recursiva con nueva cadena con el 1er personaje en rodajas.

    Que no deberían estar en un else bloque…
    Donde iba a poner la rebanada de la declaración?
    Oh, sí.. Editado.. Usted debe tener fuera de si. Debería ser llamado en cualquier caso. donde su último personaje fue vocal o no.
    Todavía hay un tema aquí que no hay nada que se devuelve.
    Sí que OP puede devolver el vowelCount de la función.. Ok, voy a publicar la función completa.

    OriginalEl autor Rohit Jain

  4. 0

    este es el enfoque directo:

    VOWELS = 'aeiouAEIOU'
    
    def count_vowels(s):
        if not s:
            return 0
        elif s[0] in VOWELS:
            return 1 + count_vowels(s[1:])
        else:
            return 0 + count_vowels(s[1:])

    es el mismo con menos código:

    def count_vowels_short(s):
        if not s:
            return 0
        return int(s[0] in VOWELS) + count_vowels_short(s[1:])

    aquí es otro:

    def count_vowels_tailrecursion(s, count=0):
        return count if not s else count_vowels_tailrecursion(s[1:], count + int(s[0] in VOWELS))

    Por desgracia, este se fallar por cadenas largas.

    >>> medium_sized_string = str(range(1000))
    >>> count_vowels(medium_sized_string)
    ...
    RuntimeError: maximum recursion depth exceeded while calling a Python object

    si esto es algo de interés, mirar este artículo de blog.

    OriginalEl autor dnozay

  5. 0

    Aquí una programación funcional enfoque para su estudio:

    map_ = lambda func, lst: [func(lst[0])] + map_(func, lst[1:]) if lst else []
    reduce_ = lambda func, lst, init: reduce_(func, lst[1:], func(init, lst[0])) if lst else init
    
    add = lambda x, y: int(x) + int(y)
    is_vowel = lambda a: a in 'aeiou'
    
    s = 'How razorback-jumping frogs can level six piqued gymnasts!'
    num_vowels = reduce_(add, map_(is_vowel, s), 0)

    La idea es dividir el problema en dos fases, donde la primera («mapa»), convierte los datos en otra forma (de una carta -> 0/1) y el segundo («reducir») recoge en los elementos convertidos en un solo valor (la suma de 1).

    Referencias:

    Otra, la más avanzada solución es convertir el problema en la cola recursiva y el uso de un cama elástica para eliminar la llamada recursiva:

    def count_vowels(s):
        f = lambda s, n: lambda: f(s[1:], n + (s[0] in 'aeiou')) if s else n
        t = f(s, 0)
        while callable(t): t = t()
        return t

    Tenga en cuenta que a diferencia de ingenuo soluciones de esto, se puede trabajar con cadenas largas sin causar «profundidad de la recursión superado» los errores.

    OriginalEl autor georg

Dejar respuesta

Please enter your comment!
Please enter your name here