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.

Generar permutaciones utilizando el Algoritmo de Heap

Estoy intentando generar todas las permutaciones para un arreglo utilizando el algoritmo de Heap que encontré en Wikipedia.

Esto es lo que he intentado hasta ahora:

n <- 3
A <- c(1, 2, 3)
perm <- function(n, A) {
  if (n == 1)
    print(perm)
  for (i in length(A))
    perm(n, A - 1) 
  if (A %% 2 == 1) {
    swap(A[i], A[n - 1])
  } else {
    swap(A[0], A[n - 1])
  } 
}
perm(3, A)

El resultado no se muestra y sería genial recibir algo de ayuda.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay algunos errores en el código que impiden generar las permutaciones. Aquí hay algunas sugerencias de ediciones para corregir los problemas:

    • Línea 1: Usa el operador de asignación <- en lugar de <.
    • Línea 2: Usa = en lugar de <- para mantener consistencia.
    • Línea 4: Renombra el segundo argumento como arr para que coincida con el nombre de la variable que se utiliza después en la función.
    • Línea 5: Usa el nombre de variable correcto arr en lugar de perm.
    • Línea 6: Usa llaves {} para encerrar el bloque del condicional “if”.
    • Línea 7: Usa la palabra clave return para devolver la permutación actual como un vector.
    • Línea 8: Usa seq_along() en lugar de length() para iterar sobre los índices del arreglo.
    • Línea 9: Corrige el error de ortografía en la llamada recursiva restando 1 de n en lugar de A.
    • Línea 10: Añade las llaves {} faltantes para encerrar el bloque del condicional “if-else”.
    • Línea 11: Corrige el error de ortografía en la llamada a la función swap() utilizando el orden correcto de los argumentos.

    Aquí está el código corregido:

    n <- 3
    arr <- c(1, 2, 3)
    
    perm <- function(n, arr) {
      if (n == 1) {
        return(arr)
      }
      for (i in seq_along(arr)) {
        perm(n - 1, arr)
        if (n %% 2 == 1) {
          swap(arr[i], arr[n])
        } else {
          swap(arr[1], arr[n])
        }
      }
    }
    
    perm(n, arr)
    

    Ten en cuenta que la función swap() no está definida en el fragmento de código que proporcionaste. Necesitarás definirla por separado o utilizar una función incorporada como rev() en su lugar. Además, la salida de la función debe ser asignada a una variable o mostrada en la consola para que sea visible.

Comments are closed.