es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Permutaciones de una lista en Haskell sin usar Data.Set

Tengo que escribir una función en Haskell que dé todas las posibles permutaciones de una lista dada.

La firma del tipo tiene que ser:

permutations :: [a] -> [[a]]

Por ejemplo, un resultado aceptable sería (bajo ghci):

λ>
λ> permutations [1,2,3]
[[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]]
λ>

Se aplican las siguientes restricciones:

  1. Las listas normales son la única estructura de datos autorizada, por lo que no se pueden usar Set o Vector.
  2. Las permutaciones se pueden producir en cualquier orden.
  3. La función debe funcionar para cualquier tipo de elemento, es decir, no se deben usar instancias de Ord a o Eq a.
  4. Solo se pueden usar las funciones de la biblioteca estándar Prelude.

¿Alguien sabe cómo podría hacerlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Haskell, permutación y combinatoria, puedo sugerir una solución al problema de escribir una función Haskell que devuelva todas las posibles permutaciones de una lista dada, cumpliendo con la firma de tipo y las restricciones especificadas.

    Aquí tienes una implementación de la función:

    permutations :: [a] -> [[a]]
    permutations [] = [[]]
    permutations (x:xs) = concatMap (insertElem x) (permutations xs)
      where
        insertElem x [] = [[x]]
        insertElem x yss@(y:ys) = (x:yss) : map (y:) (insertElem x ys)
    

    Esta implementación utiliza la recursión y el emparejamiento de patrones para manejar el caso de la lista vacía, y construye las permutaciones de la cola de la lista utilizando la función concatMap y una función auxiliar insertElem que inserta un elemento en una lista en todas las posibles posiciones. La lista resultante de permutaciones se obtiene concatenando las listas de permutaciones con el elemento insertado en todas las posibles posiciones.

    Esta implementación funciona para cualquier tipo de elemento, sin requerir instancias de Ord a o Eq a, ya que solo utiliza operaciones básicas de lista del estándar Prelude.

    Puedes utilizarlo de la siguiente manera:

    > permutations [1,2,3]
    [[1,2,3],[2,1,3],[2,3,1],[1,3,2],[3,1,2],[3,2,1]]
    

    ¡Espero que esto te sea de ayuda!

Comments are closed.