Skip to content

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 lista con los tres strings, imprime Lista: y luego Permutaciones:.
  • 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 != i solo cubre el caso de 3 índices.

Es fácil de leer y entender

  • La lógica es directa: se usan tres bucles for anidados 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, j y k son 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 lista es adecuado, los índices i, j, k podrían ser más descriptivos (p, q, r o pos1, 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.permutations ofrecerí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

  1. Crear una función genérica
    Define una función imprimir_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íamos itertools.permutations”.
  2. Mejorar la legibilidad

    • Usa nombres de variables más descriptivos, por ejemplo pos1, pos2, pos3 o indices.
    • 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.
  3. 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.
  4. 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.
  5. 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), usa print(' '.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.
  6. 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 es n!; puedes mostrar ese número al usuario como información adicional.
  7. 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 como from itertools import permutations y ú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!