2016-04-30 6 views
-2

LISPのリストの挿入に関するコードがあります。私はHELP挿入一般的なリストの並び替え

(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

をあなたはそれがdoesnの「とはどういう意味ですかやってない?どのようなエラーが出ますか? "enter code her"とは何ですか?なぜ 'myList'を引数なしの関数として' insertionSort'に渡すのですか? – Rptx

答えて

1

自体のソートが動作しているようですので、問題は、ユーザからの入力を読んで..ですこれが機能しない理由はわかりません。

最初に、SETQを使用して変数を導入しないでください。正しいオプションはLETDEFVAR or DEFPARAMETERのいずれかになります。 Practical Common Lispvariablesの章を読んでください。しかし、このプログラムでは、必ずしもそれらのいずれかを使う必要はありません。

第2の問題は、INSERTIONSORTを呼び出すときに、かっこ内に引数MYLISTをラップしたことです。 Lispsでは、カッコ内のものは一般に関数呼び出しとして扱われます。 MYLISTは関数ではなく変数であるため、エラーが発生します。それを呼び出すための正しい方法はもちろん、次のようになります。ところで

(insertionSort myList) 

注意、のLispでの命名規則ではなく、キャメルケースの単語間のダッシュと下部ケースを使用することであること。したがって、関数insertion-sortと変数my-listの名前を付けるほうがよいでしょう。

READは、入力を読みにくい方法ではありません。 PARSE-INTEGERREAD-LINEを一緒に使用して、ユーザーから数値を読み取る方が良いです。ユーザーエクスペリエンスを向上させるには、入力を読み込む前に何らかのプロンプトを表示する必要があります。ここではそれを行うために小さなヘルパー関数です:

(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*))) 

数字が並べ替える(およびそれらを並べ替え)するために、我々はこのようにユーザーに確認することができ、という使い方:

(insertionSort (loop 
        repeat (prompt-for-number "How many numbers: ") 
        collecting (prompt-for-number "Number: "))) 
関連する問題