Revisión automática de la práctica 01-permutaciones
Este es el resultado de una revisión automática de la prácica 01-permutaciones, 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.
Revisión automática de programa
Programa revisado:
# PRÁCTICA PERMUTACIONES CON MAS DE 3 ELEMENTOS #
lista = ["un", "dia", "vi", "una", "vaca"]
print("Lista:", lista)
print("Permutaciones:")
def permutaciones(lista): # EN ESTE CASO, LA FUNCION CREA n! PERMUTACIONES, SIENDO n len(lista)
if len(lista) == 0:
return [[]]
resultado = []
for i in range(len(lista)):
inicial = lista[i]
resto = lista[:i] + lista[i+1:]
for p in permutaciones(resto):
resultado.append([inicial] + p)
return(resultado)
resultado = permutaciones(lista)
for p in resultado:
print(" ".join(p)) #CON ESTA LINEA EL RESULTADO QUEDA BONITO
Análisis
Cumple con el enunciado
El programa cumple con el enunciado correctamente. Utiliza una lista con cinco strings (más de tres, como se solicita en la opción) y sigue las líneas iniciales especificadas (print('Lista:', lista) y print('Permutaciones:')). Genera todas las permutaciones de la lista y las imprime separadas por espacios, como en el ejemplo. Para una lista de n elementos, produce n! permutaciones, lo cual es correcto.
Es fácil de leer y entender
El programa es relativamente fácil de entender, pero presenta algunos desafíos para principiantes. El uso de la recursión para generar permutaciones puede ser abstracto si el alumno no ha visto este concepto a fondo. Los nombres de variables están en español y son descriptivos (por ejemplo, inicial, resto, resultado), lo cual ayuda a la comprensión. Sin embargo, el comentario en la función (# EN ESTE CASO, LA FUNCION CREA n! PERMUTACIONES...) es útil pero podría ser más detallado para explicar la recursión paso a paso. El bucle final con print(" ".join(p)) es claro y conciso.
Sigue buenas prácticas de programación
El programa sigue varias buenas prácticas:
- Modularidad: encapsula la lógica de permutaciones en una función reutilizable.
- Uso correcto de parámetros: la función
permutacionestoma la lista como argumento. - Comentarios básicos: hay un comentario que explica el propósito de la función.
- No usa variables globales innecesarias.
Sin embargo, hay áreas de mejora:
- Eficiencia: La recursión puede ser ineficiente para listas grandes debido al consumo de memoria y riesgo de stack overflow. Para una práctica, es aceptable, pero no se mencionan alternativas.
- Manejo de casos edge: No valida si la entrada es una lista vacía o contiene elementos no-string, aunque el código base lo maneja implícitamente.
- Documentación: Falta un docstring en la función para explicar su propósito y parámetros.
Recomendaciones de mejora
-
Sin itertools: El programa no usa
itertools, lo cual está bien ya que la práctica debe enseñarse desde cero. Si el programa usaraitertools, se recomendaría evitarlo para esta práctica, pero aquí no es necesario. - Bucles anidados: El programa no usa bucles anidados porque opta por recursión. Podrías sugerir un enfoque iterativo con bucles anidados para listas pequeñas (por ejemplo, cuatro elementos) como ejercicio, pero esto no escala para un número arbitrario sin usar técnicas más avanzadas.
-
Mejoras sugeridas:
- Añadir manejo de errores: Valida que la entrada sea una lista y que contenga strings, retornando un mensaje claro si no.
-
Documentar la función: Usa un docstring para explicar la recursión, por ejemplo:
def permutaciones(lista): """ Genera todas las permutaciones de una lista. Utiliza recursión: para cada elemento, combina con las permutaciones del resto. """ - Optimizar para el caso vacío: Aunque funciona, el código podría ser más explícito en el manejo de listas vacías.
- Considerar un enfoque iterativo: Para listas de hasta 4 elementos, usa bucles anidados fijos como alternativa, pero no lo recomiendes para n arbitrario.
Estas mejoras respetan el enunciado y ayudarán a que el programa sea más robusto y comprensible para principiantes.