2016-04-30 10 views
-2

Ich habe einen Code zum Einfügen einer Liste in LISP. Ich habe keine Ahnung, warum dies nicht funktioniert .. HELPEinfügen Sortieren einer Liste in gemeinsamen LISP

(defun insertionSort (myList) 
    (if (null myList) 
     '() 
     (insertInPlace (car myList) (insertionSort (cdr myList))))) 
enter code her 
(defun insertInPlace (e myList) 
    (if (null myList) 
     (cons e '()) 
     (if (<= e (car myList)) 
      (cons e myList) 
      (cons (car myList) (insertInPlace e (cdr myList)))))) 

(setq n (read)) 
(setq n (- n 1)) 
(setq d (read)) 
(setq myList (list d)) 
(dotimes (i n) 
    (setq d (read)) 
    (setq myList (cons d myList)) 
) 
(write myList) 
(insertionSort(myList)) 
+1

Was meinst du mit „es doesn arbeitest du nicht? Welchen Fehler bekommst du? Was ist los mit "Code eingeben"? Warum versuchen Sie, "myList" als eine Funktion ohne Argumente auszuführen, bevor Sie das an "insertionSort" übergeben – Rptx

Antwort

1

Die Sortierung selbst scheint zu funktionieren, so ist das Problem mit Eingabe vom Benutzer zu lesen.

Zuerst sollten Sie SETQ nicht verwenden, um Variablen einzuführen. Die richtigen Optionen wären entweder LET, DEFVAR or DEFPARAMETER. Sie sollten das Kapitel variables im Buch Practical Common Lisp lesen. In diesem Programm müssen Sie jedoch keines von ihnen verwenden. Das zweite Problem besteht darin, dass Sie beim Aufruf INSERTIONSORT das Argument MYLIST in Klammern umschlossen haben. In Lisps werden Dinge in Klammern normalerweise als Funktionsaufrufe behandelt. Da MYLIST eine Variable und keine Funktion ist, führt dies zu einem Fehler. Der richtige Weg, es zu nennen wäre natürlich:

(insertionSort myList) 

Hinweis, btw, dass die Namenskonvention in Lisps ist anstelle von Camelcase mit Bindestrichen zwischen den Wörtern Kleinbuchstaben zu verwenden. Daher wäre es besser, die Funktion insertion-sort und die Variable my-list zu benennen.

READ ist keine sehr sichere Art, Eingaben zu lesen. Es ist besser, PARSE-INTEGER zusammen mit READ-LINE zu verwenden, um Zahlen vom Benutzer zu lesen. Für eine bessere Benutzererfahrung sollten Sie auch eine Art Aufforderung ausgeben, bevor Sie die Eingabe lesen. Hier ist eine kleine Hilfsfunktion, das zu tun:

(defun prompt-for-number (prompt) 
    "Display PROMPT and read a number from the user." 
    (do ((number nil (parse-integer (read-line *query-io*) :junk-allowed t))) 
     (number number) 
    (write-string prompt *query-io*) 
    (finish-output *query-io*))) 

dass verwenden, können wir den Benutzer fragen Sie nach Zahlen zu sortieren (und sortieren sie) wie folgt aus:

(insertionSort (loop 
        repeat (prompt-for-number "How many numbers: ") 
        collecting (prompt-for-number "Number: "))) 
Verwandte Themen