Produciendo todas las asignaciones por n artículos de una lista -- mbinatorics campo con common-lisp camp codereview Relacionados El problema

Producing all allocations by n items from a list


3
vote

problema

Español

Tengo una fuerte sensación de que el código a continuación es feo al menos, ya que hay 2 "contras".
Agradecería que me aconsejas formas de mejorarlo.

El código produce toda la asignación por n elementos de la lista LST.

  (defun allocations (lst n)   (if (= n 1)       (loop for i in lst        collect (cons i nil))       (loop for i in lst    append (mapcar #'(lambda (l) (cons i l))                       (allocations (remove i lst) (- n 1))))))   
Original en ingles

I have strong feeling that the code below is ugly at least as there are 2 same "cons".
I would appreciate if you advise me ways to improve it.

The code produces all allocation by n items from list lst.

(defun allocations (lst n)   (if (= n 1)       (loop for i in lst        collect (cons i nil))       (loop for i in lst    append (mapcar #'(lambda (l) (cons i l))                       (allocations (remove i lst) (- n 1)))))) 
     
   
   

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 
  else4  

Este debe ser un caso más general del problema (es decir, no asumirá la naturaleza de los elementos en la lista), pero no verifica que haya suficiente de los elementos en la lista de origen para construir el Número requerido de permutaciones.

 
(defun allocations (source length)   (if (= 1 length)       (list (list (car source)))       (loop for processed = nil then (cons (car i) processed)          for i on source          for todo = (cdr i)          appending            (loop for intermediate               in (allocations                   (append (reverse processed) todo)                   (1- length))               appending                 (loop for prefix = nil then (cons (car suffix) prefix)                    for suffix on intermediate                    collect (append prefix (list (car i)) suffix)))))) 

This should be a more general case of the problem (i.e. it makes no assumption of the nature of the elements in the list), but it doesn't verify that there is enough of the elements in the source list to build the required number of permutations.

 
 

Relacionados problema

7  Macro Common Lisp: Revisión para la calidad del código y el nombre de fugas que se escapa  ( Common lisp macro review for code quality leaky name escaping ) 
(defmacro with-condition-retries(retries expected-errors fail-function &body body) "Attempts to execute `body` `retries` times, watching for `expected-erro...

1  ¿Está usando defvar para una variable no global OK?  ( Is using defvar for a non global variable ok ) 
Estoy llamando defvar en medio de una definición de función. Y hasta ahora, siempre he visto su uso, con defparameter para la variable global. Como *erro...

2  Macro de lector octal simple en Lisp comunes  ( Simple octal reader macro in common lisp ) 
Como ejercicio, he implementado una macro de lector simple en Lisp común (usando SBCL). Convierte el octal (solo enteros sin firmar) en números. Uso: exe...

2  Desviación estándar de temperaturas por hora de 2 días  ( Standard deviation of hourly temperatures of 2 days ) 
Parece que cuando programa en Lisp Mi cerebro va a piloto automático y termino resolviendo el problema de alguna manera. Ni siquiera creo que solo lo haga y f...

10  Generando tokens de sesión difícil de adivinar  ( Generating hard to guess session tokens ) 
¿Este código crea tokens de sesión suficientemente difíciles de adivinar, asumiendo que el servidor y el cliente se comunican a través de HTTPS? Tomar 2 ...

4  Parser NetString en Lisp comunes  ( Netstring parser in common lisp ) 
A continuación se muestra una NetString Parser I escribí en Common Lisp. El documento contiene el uso y la devolución. (defun parse-netstring (netstring ...

3  Recursión vs. iteración en Macro LISP  ( Recursion vs iteration in lisp macro ) 
He estado programando Clojure por un rato y recientemente comenzó a aprender a Lisp común. Una de mis cosas favoritas de Clojure es el operador de subprocesos...

3  Determinar la sangría de una línea de código  ( Determine indentation of a line of code ) 
La siguiente función determina la cantidad de sangría de una cadena. Devuelve dos valores. La primera es una sangría efectiva donde las pestañas se expanden d...

6  BST con cuenta de nodos  ( Bst with node count ) 
Tomé una simple implementación de BST, que solo es realmente un conjunto (es decir, el elemento solo, no el valor clave), y decidí agregar un recuento de nodo...

6  Determinar si f (n) = n ^ 2 + 3n + 5 es divisible por 121  ( Determining if fn n2 3n 5 is ever divisible by 121 ) 
Dado el siguiente problema: Se conjeture eso para cualquier $ N & GT; 0 $, $ N ^ 2 + 3n + 5 $ nunca es divisible por 121. Pruebe esta conjetura por ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos