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.
- Comprobación de archivos con extension '.py'
- Comprobación con ficheros de solución
- Revisión automática de programa
- Análisis
- Recomendaciones de mejora
Comprobación de archivos con extension '.py'
Archivos encontrados, que no son : permutaciones.py
Correcto, se elige permutaciones.py para el análisis
Comprobación con ficheros de solución
Los archivos son diferentes de los de la solución.
Revisión automática de programa
Programa revisado:
import random
import math
listaeditable = ["Uno","Dos","Tres","Cuatro"]
possiblecombinations = math.factorial(len(listaeditable))
combinations = []
while not len(combinations) == possiblecombinations:
lista = list(listaeditable)
combinacion = []
for _ in range(len(lista)):
item = random.choice(lista)
lista.remove(item)
combinacion.append(item)
if combinacion not in combinations:
combinations.append(combinacion)
combinationprint = ' '.join(combinacion)
print(combinationprint)
Análisis
Cumple con el enunciado
El programa no cumple completamente con el enunciado. Aunque genera permutaciones válidas y las imprime en el formato solicitado, su enfoque basado en elecciones aleatorias no garantiza que todas las permutaciones se generen. Para listas con 4 o más elementos, el bucle while podría ejecutarse indefinidamente si el generador aleatorio no encuentra todas las combinaciones posibles. Además, el orden de las permutaciones en la salida no es sistemático, lo que contradice el ejemplo del enunciado.
Es fácil de leer y entender
El código no es fácil de leer para un principiante. El uso de random.choice y la modificación de la lista durante el proceso (lista.remove(item)) oculta la lógica de permutación. La variable possiblecombinations no está bien explicada, y el bucle while con una condición de parada basada en len(combinations) puede resultar confuso. La falta de comentarios dificulta entender cómo se generan las permutaciones.
Sigue buenas prácticas de programación
El programa no sigue buenas prácticas:
-
Eficiencia: Generar permutaciones aleatoriamente y verificar duplicados con
if combinacion not in combinationses ineficiente (especialmente para listas largas). - Claridad: El enfoque no refleja un algoritmo conocido de permutaciones, lo que complica su mantenimiento.
- Robustez: No maneja casos especiales (ej: listas vacías o con elementos repetidos).
Recomendaciones de mejora
-
Evitar el uso de
randompara permutaciones sistemáticas
El enunciado requiere listar todas las permutaciones, no generarlas aleatoriamente. Un enfoque basado en bucles anidados (para listas de tamaño fijo) o recursión (para tamaño arbitrario) sería más adecuado. -
Usar
itertools.permutations(solo para referencia)
Aunque en esta práctica se espera implementar el algoritmo manualmente, en un programa real se recomendaría usaritertools.permutationspara evitar reinventar la rueda. -
Mejorar la claridad de las variables
Renombrarlistaeditablealista_originaloelementosypossiblecombinationsatotal_permutacionesharía el código más legible. -
Agregar comentarios explicativos
Explicar por qué se usamath.factorial, cómo se genera cada permutación y el propósito del buclewhileayudaría a entender el código. -
Implementar un algoritmo sistemático
Para listas de 3 o 4 elementos, se podrían usar bucles anidados. Para listas arbitrarias, un algoritmo recursivo (como backtracking) sería más confiable, aunque requiere conceptos avanzados. -
Eliminar la verificación de duplicados
Dado que la lista original no tiene elementos repetidos, la condiciónif combinacion not in combinationses innecesaria y consume recursos. Si la lista tuviera duplicados, se debería ajustar el algoritmo para evitarlos, no verificarlos a posteriori.