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:
lista = ['Hola', 'Qué tal', 'Adiós']
print('Lista:', lista)
print('Permutaciones:')
for i in range(len(lista)):
for j in range(len(lista)):
for k in range(len(lista)):
if i !=j and j != k and k != i:
print(lista[i],lista[j],lista[k])
He revisado el programa que has enviado. A continuación encontrarás el análisis en la estructura solicitada y, después, recomendaciones de mejora.
Análisis
Cumple con el enunciado
- El programa inicia exactamente con las líneas requeridas: define
listacon los tres strings, imprimeLista:y luegoPermutaciones:. - Genera y muestra todas las permutaciones de los tres elementos (6 líneas). Cada línea muestra los tres strings separados por un espacio, que coincide con la salida esperada en el ejemplo.
-
No cumple con la parte opcional: no es capaz de manejar listas de cuatro o más elementos, ya que el número de bucles anidados está fijado a tres y la condición
i != j and j != k and k != isolo cubre el caso de 3 índices.
Es fácil de leer y entender
- La lógica es directa: se usan tres bucles
foranidados y una condición para asegurarnos de que los índices sean distintos. Para alguien que recién aprende a programar, la intención de “probar todas las combinaciones sin repetir elementos” es comprensible. - Sin embargo, el código se vuelve rápidamente ilegible a medida que crece la cantidad de elementos. Los nombres de variables
i,jykson genéricos; aunque funcionan, no reflejan qué representan (posiciones de los elementos). No hay comentarios ni docstring que expliquen la función del bloque. - La ausencia de una función reutilizable o de un
if __name__ == "__main__":hace que el script sea menos modular.
Sigue buenas prácticas de programación
- Separación de responsabilidades: todo el código está en el ámbito global, sin una función específica para generar o imprimir las permutaciones. Esto dificulta la reutilización y la prueba unitaria.
-
Nombres significativos: aunque
listaes adecuado, los índicesi,j,kpodrían ser más descriptivos (p,q,ropos1,pos2,pos3). - Código repetitivo: para 3 elementos se necesitan tres bucles anidados; para 4 serían cuatro, y así sucesivamente. Esto viola el principio DRY (Don’t Repeat Yourself) y hace que la solución no sea escalable.
- Sin manejo de errores ni validación: el programa asume que la lista contiene al menos tres elementos; si la lista es más corta, se producirán índices fuera de rango.
-
No usa
itertools: la práctica sugiere evitar esa librería, lo cual es correcto. Aún así, para un proyecto real,itertools.permutationsofrecería una solución más concisa y eficiente. - Documentación: falta un docstring que describa el propósito del script y una breve explicación de la lógica.
Recomendaciones de mejora
-
Crear una función genérica
Define una funciónimprimir_permutaciones(lista)que reciba cualquier lista de cadenas y genere sus permutaciones sin importar su longitud.- Opción recursiva/back‑tracking: construye cada permutación paso a paso, marcando los elementos ya usados.
-
Opción basada en
itertools.permutations: aunque no la uses en esta práctica, puedes comentarla como “para un programa real usaríamositertools.permutations”.
-
Mejorar la legibilidad
- Usa nombres de variables más descriptivos, por ejemplo
pos1,pos2,pos3oindices. - Agrega comentarios breves que expliquen qué se está comprobando en la condición.
- Incluye un docstring al inicio del script y a la función.
- Usa nombres de variables más descriptivos, por ejemplo
-
Modularidad
- Envuelve la lógica principal en
if __name__ == "__main__":para permitir importar el módulo sin ejecutar la generación de permutaciones. - Mantén la impresión de la lista original y del encabezado “Permutaciones:” fuera de la función, y pasa la lista como parámetro.
- Envuelve la lógica principal en
-
Extensibilidad a más elementos
- La versión recursiva será capaz de manejar 4, 5 o cualquier número de strings sin necesidad de añadir más bucles.
- Si decides mantener la versión de bucles anidados, al menos genera la condición de unicidad de forma más genérica:
if len({i, j, k}) == len(lista), aunque esto sigue siendo poco flexible.
-
Mejorar la salida
- Para asegurarte de que los elementos estén separados exactamente por un espacio (y no por la coma‑espacio predeterminada de
print), usaprint(' '.join(lista[i], lista[j], lista[k])). - Si en el futuro quisieras almacenar las permutaciones en una lista en lugar de imprimirlas directamente, la función podría devolver una lista de listas.
- Para asegurarte de que los elementos estén separados exactamente por un espacio (y no por la coma‑espacio predeterminada de
-
Validación básica
- Comprueba que la lista no esté vacía o que tenga al menos dos elementos (no hay permutaciones únicas con un solo elemento).
- Si la lista es de longitud
n, la cantidad de permutaciones esn!; puedes mostrar ese número al usuario como información adicional.
-
Estilo de código
- Sigue la PEP 8: usa 4 espacios por nivel de indentación, líneas no más largas de ~80‑88 caracteres y coloca las importaciones al principio del archivo.
- Si decides usar
itertools.permutations, agrégalo comofrom itertools import permutationsy úsalo dentro de la función, comentando que es la forma más “profesional” de resolverlo, pero que para esta práctica lo evitas.
Con estos cambios, el programa seguirá cumpliendo la especificación original, será mucho más legible, y podrás expandirlo fácilmente para listas de cualquier tamaño. ¡Sigue experimentando con la recursión o el back‑tracking; son herramientas fundamentales para resolver problemas de combinatoria sin depender de bucles anidados!