Pregunta

Me he desafiado a hacer todas las tareas en mi clase de algoritmos en común Lisp.Estoy en un día uno de aprendizaje de Lisp y he golpeado un obstáculo.

La asignación es crear un tipo de combinación que se convierta en inserción cuando llegue a una longitud de subconjunto arbitraria (TIMSORT).La sección de inserción funciona perfectamente, pero la parte dividida de la fusión solo funciona cuando el programa tiene que dividirse dos veces.Sé que tiene que ver con la forma en que las listas trabajan en Lisp, soy demasiado nuevo para identificar el problema.

Creo que se golpea en un bucle infinito ... No estoy seguro porque cuando lo ejecuto con las declaraciones de depuración, nunca se imprimen cuando el set tiene demasiados elementos.

No estoy aquí, pidiendo respuestas específicas o para que alguien escriba mi código.Tal vez una explicación o un punto en la dirección correcta ayudaría mucho!

Mi código:

;; Insertion sort method call (returns sorted list)
(defun insert-sort (lst) ... )

;; Merge sort method call
(defun merge-sort (lst)
  (print 'Merge)
  (print lst)
  (if (< (length lst) 7) ; Check to see if list is small enough to insert sort
      (insert-sort lst) ; Do so
      (progn ; else
        (setf b (merge-split lst)) ; Split the list, store into b
        (setf (car b) (merge-sort (car b))) ; Merge sort on first half
        ;; --- I think it's happening here ---
        (setf (cdr b) (merge-sort (cdr b))) ; Merge sort on second half
        (merge 'list (car b) (cdr b) #'<)))) ; Merge the two lists together (using API)

;; Split a list into two parts
(defun merge-split (lst)
   (progn
     (setf b lst) ; Set b to first index
     (setf a (cdr lst)) ; Set a to the rest of the list
     (loop while a do ; Loop while a != null
           (setf a (cdr a)) ; Make a equal next list node
           (if a ; If it still exists
               (progn
                 (setf a (cdr a)) ; Inc a again
                 (setf b (cdr b))))) ; Also inc b (b should always be half of a)
     (setf a (cdr b)) ; Set a to the list after b
     (setf (cdr b) NIL) ; Delete link after b
     (cons lst a))) ; Return in a cons

NOTA: Este es un código que he escrito, no salió de Internet ... Probablemente, puede decir, aunque jaja

¿Fue útil?

Solución

Estás siendo mordido por variables de alojamiento dinámicamente.La primera vez que llame a SetF para configurar A, B crea implícitamente las variables globales y dinámicamente ampliadas.Utilice, se deje declararlos.Permite que le permita incluir una lista de expresiones para ejecutar, al igual que ProGn, por lo que mi sugerencia es que puede solucionar esto cambiando a sus 2 progniciones en que permite.Déjame saber si necesitas más de esto para despegar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top