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 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

. El programa genera todas las permutaciones posibles de una lista de elementos. Al aplicar la función 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

⚠️ Parcialmente. La lógica recursiva es correcta, pero puede resultar compleja para un principiante. Variables como 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

⚠️ Parcialmente.

  • Nombres de variables: Aunque permutar es un nombre claro para la función, el uso de listas y todas en 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 permutar es 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

  1. 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]
  2. Mejorar nombres de variables:

    • Renombrar listas a palabras o elementos para evitar confusiones.
    • Usar nombres en inglés (como permute en lugar de permutar) si el enunciado lo permite, para alinearse con convenciones comunes en Python.
  3. 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")
  4. Alternativa con itertools.permutations:

    • Aclarar que, en un programa real, se podría usar itertools.permutations para 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))
  5. 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.
  6. 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.