2010-12-13 23 views
1

J'ai du mal à faire quicksort en Lisp.regrading sous-liste sur le tri rapide

Mon objectif est:

Si une liste contient l'élément 0 ou 1, est déjà trié. Sinon, triez-le comme suit: obtenez d'abord le pivot, qui est le premier élément de la liste. Maintenant, parcourez le reste de la liste (en utilisant DOLIST), comparez chaque élément avec le pivot. Si un élément est inférieur ou égal au pivot, placez-le dans la sous-liste de gauche, sinon placez-le dans la sous-liste de droite (en utilisant CONS ou APPEND). Puis appelez Qsort pour trier la sous-liste gauche et la sous-liste à droite. Enfin, combinez la sous-liste gauche, le pivot et la sous-liste de droite dans une liste triée. (LET (PIVOT (FIRST X)) (DOLIST (IX PIVOT):

Ceci est mon code:

(defun qsort (x) 
    (if (>= 1 (length x)) 
     (format t"~%~s is already sorted" x) 

     ((let (pivot (first x)) 
     (dolist (i x) 
      (if (>= pivot (nth i x)) 
       (list y (nth i)) 
       (list z (nth i)))) 
     (appned y z))))) 

mais je semble frapper le mur en obtenant

mal formé lambda (IF (> = PIVOT (NTH IX)) (LISTE PIVOT (NTH I)) (LISTE PIVOT (NTH I)))))

du compilateur.

J'espère que vous pouvez aider. Je vous remercie.

Répondre

1

Pourquoi existe-t-il deux couches de parenthèses autour de LET?

Pourquoi une couche de parenthèses est-elle manquante à l'intérieur de LET autour des liaisons?

Pourquoi appelez-vous (nth i x)? Pourquoi avec moi? Pourquoi appelez-vous NTH avec un argument, quand cela prend deux?

Quelle est la fonction APPNED? Il n'y a pas de fonction de ce nom.

(> = x 1) est (plusp x)

et plus ...