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 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:
#permutaciones.py
def permutar(lista):
if len(lista) == 1:
return [lista]
resultado = []
for i in range(len(lista)):
actual = lista[i]
resto = lista[:i] + lista[i+1:]
for p in permutar(resto):
resultado.append([actual] + p)
return resultado
listas = ['abde', 'está', 'en', 'la uni']
todas = permutar(listas)
for p in todas:
print(' '.join(p))
Análisis
Cumple con el enunciado
permutar a listas = ['abde', 'está', 'en', 'la uni'], produce todas las combinaciones ordenadas de las 4 palabras, como se espera. Por ejemplo, una permutación válida sería ['está', 'abde', 'la uni', 'en']. El uso de recursión para construir permutaciones es correcto y el resultado final se imprime en el formato solicitado (una permutación por línea, con palabras separadas por espacios).
Es fácil de leer y entender
i, p, actual y resto son descriptivas, pero el flujo recursivo no está explicado. Por ejemplo, no se comenta cómo se combinan los elementos para formar las permutaciones. Además, el nombre listas es ambiguo (parece referirse a múltiples listas, pero en realidad es una lista de palabras). Un nombre como palabras o elementos sería más claro.
Sigue buenas prácticas de programación
-
Nombres de variables: Aunque
permutares un nombre claro para la función, el uso delistasytodasen el ejemplo no sigue la convención de nombres en inglés para funciones/variables en Python, lo cual podría generar inconsistencia. -
Manejo de errores: No se valida si la entrada a
permutares una lista válida (por ejemplo, si contiene elementos repetidos o no se pasa una lista). - Eficiencia: Para listas grandes, la recursión profunda podría causar errores de stack overflow, pero esto no es crítico en un ejercicio académico con entradas pequeñas.
Recomendaciones de mejora
-
Agregar comentarios explicativos:
- Explicar el funcionamiento recursivo en la función
permutar, especialmente cómo se construyen las permutaciones combinando el elemento actual con las permutaciones del resto. - Ejemplo:
# Si la lista tiene un solo elemento, devuelve una lista con esa única permutación if len(lista) == 1: return [lista]
- Explicar el funcionamiento recursivo en la función
-
Mejorar nombres de variables:
- Renombrar
listasapalabrasoelementospara evitar confusiones. - Usar nombres en inglés (como
permuteen lugar depermutar) si el enunciado lo permite, para alinearse con convenciones comunes en Python.
- Renombrar
-
Validar casos extremos:
- Añadir una validación para listas vacías o elementos no listas, aunque sea con un comentario indicando que se asume una entrada válida.
- Ejemplo:
if not isinstance(lista, list): raise TypeError("La entrada debe ser una lista")
-
Alternativa con
itertools.permutations:- Aclarar que, en un programa real, se podría usar
itertools.permutationspara simplificar el código. Sin embargo, en esta práctica, el objetivo es implementar la lógica manualmente, por lo que esta opción no debe usarse aquí. - Ejemplo (sólo como referencia):
from itertools import permutations todas = list(permutations(listas))
- Aclarar que, en un programa real, se podría usar
-
Probar con entradas más simples:
- Incluir pruebas con listas pequeñas (como
['a', 'b']) para verificar que el código funciona correctamente en casos básicos. Esto ayuda a entender el flujo de ejecución.
- Incluir pruebas con listas pequeñas (como
-
Evitar duplicados innecesarios:
- Si el enunciado permite elementos repetidos en la lista de entrada, el código ya maneja esto correctamente. Si no, se podría agregar una validación para evitar duplicados.
El programa cumple con el objetivo, pero se beneficiaría de comentarios y nombres más descriptivos para facilitar su comprensión por parte de principiantes.