Skip to content

Revisión automática de la práctica 06-palindromo

Este es el resultado de una revisión automática de la prácica 06-palindromo, tal y como la hemos recogido de este repositorio de entrega. Por favor, ten en cuenta que al ser una revisión automática, realizada en parte con la ayuda de un asistente de inteligencia artificial generativa, puede incluir errores, y ser incorrecta. Pero leela con atención, porque creemos que puede tener información útil. Si tienes cualquier duda, o crees que la revisión es errónea, por favor, consulta con los profesores de la asignatura.


Comprobación de archivos con extension '.py'

  • Archivos Python excluidos de la búsqueda:
  • Archivos Python encontrados (excluyendo esos): palindromo.py

Correcto, se elige palindromo.py como entrega.

Comprobación con ficheros de solución

Los archivos son diferentes de los de la solución.

Prueba automática del programa

Pruebas realizadas por 06-palindromo/tests/test_palindromo.py:

OK

Pruebas realizadas por 06-palindromo/tests/test_program.py:

OK

Revisión automática de programa

Programa revisado:

import sys

def entrada_texto():
    if len(sys.argv) < 2:
        print("Uso: python3 palindromo.py \"<cadena de texto>\"")
        sys.exit(1)
    texto = sys.argv[1].lower()
    return texto

def palindromo(texto: str) -> bool:
    """Determina si el texto es un palíndromo.

    :param texto: Cadena de caracteres a evaluar, en minúsculas y sin caracteres no alfabéticos
    returns: True si es palíndromo, False en caso contrario"""

    if len(texto) > 0 and not texto[0].isalpha(): # Si el primer carácter no es una letra, se ignorará
        return palindromo(texto[1:])
    if len(texto) > 0 and not texto[-1].isalpha(): # Si el último carácter no es una letra, se ignorará
        return palindromo(texto[:-1])

    if len(texto) < 2:
        print("Es palíndromo")
        return True
    if texto[0] != texto[-1]:
        print("No es palíndromo")
        return False
    return palindromo(texto[1:-1])

def main():
    texto = entrada_texto()
    palindromo(texto)

if __name__ == "__main__":
    main()

Análisis

Cumple con el enunciado

El programa no cumple con el enunciado por varios motivos clave:

  1. Limpieza de caracteres: El enunciado exige que la función palindromo() reciba una cadena previamente procesada (sin caracteres no alfabéticos y en minúsculas). Sin embargo, el estudiante realiza esta limpieza dentro de la función recursiva (verificando isalpha() en cada llamada), lo cual viola el requisito de que la función sea "puramente recursiva" y reciba ya los datos limpios.
  2. Salida de texto: La función palindromo() imprime directamente los mensajes "Es palíndromo" o "No es palíndromo", cuando según el enunciado solo debe devolver un booleano. La impresión debe gestionarse en main(), no en la función recursiva.
  3. Manejo de resultados: En main(), se llama a palindromo(texto) pero no se usa su valor de retorno para decidir qué imprimir, lo que rompe el flujo esperado.

Es fácil de leer y entender

El código es confuso para un principiante:

  • Mezcla lógica de limpieza de datos con la verificación recursiva, lo que dificulta entender el propósito de cada parte.
  • Los print() dentro de la función recursiva generan comportamientos inesperados (ej.: múltiples impresiones en cadenas largas).
  • La recursión intenta resolver dos problemas a la vez (limpieza y verificación), cuando el enunciado separa claramente estas responsabilidades.

Sigue buenas prácticas de programación

No sigue buenas prácticas:

  • Función con responsabilidades múltiples: palindromo() hace limpieza de datos, verificación recursiva e impresión, violando el principio de responsabilidad única.
  • Efectos secundarios no deseados: Los print() dentro de una función recursiva rompen la pureza de la recursión y dificultan el reuso del código.
  • Falta de separación de capas: La lógica de procesamiento (limpieza) debe estar en main(), no en la función recursiva.

Recomendaciones de mejora

  1. Mover la limpieza a main():

    • Antes de llamar a palindromo(), procesa el texto para:
      • Convertir a minúsculas.
      • Eliminar caracteres no alfabéticos (usando isalpha() en un bucle o comprensión de listas).
    • Ejemplo: texto_limpio = ''.join(c for c in texto.lower() if c.isalpha()).
  2. Eliminar print() de palindromo():

    • La función debe solo devolver True o False sin imprimir nada.
    • En main(), usa el resultado para mostrar el mensaje adecuado:
      if palindromo(texto_limpio):
          print("Es palíndromo")
      else:
          print("No es palíndromo")
  3. Simplificar la recursión:

    • Al recibir ya el texto limpio, la función recursiva solo debe comparar primer/último carácter y reducir la cadena:
      if len(texto) < 2:
          return True
      if texto[0] != texto[-1]:
          return False
      return palindromo(texto[1:-1])
  4. Corregir entrada_texto():

    • Asegurar que siempre devuelva una cadena (incluso si está vacía), sin asumir que hay argumentos válidos (el mensaje de uso ya está bien gestionado).