2016-09-25 62 views
-3

我正在嘗試在lisp中以升序排列3個數字的排序列表。 但編譯和加載時出現錯誤,如「if的錯誤數量」。如何在lisp中以升序排列列表中的3個數字

(defun order (n1 n2 n3) 
    (if (>= n1 n2) 
     (progn(progn(if (>= n1 n3) 
      (progn(if (>= n2 n3) (progn(setf max n1) (setf mid n2) (setf min n3))  (progn(setf max n1) (setf mid n3) (setf min n2)))) 
     (progn(setf max n3) (setf mid n1) (setf min n2)) 
     ))) 
     (progn(progn(if (< n1 n3) 
      (progn(if (>= n2 n3) (progn(setf max n2) (setf mid n3) (setf min n1))  (progn(setf max n3) (setf mid n2) (setf min n1)))) 
     ((setf max n2) (setf mid n1) (setf min n3)) 
     ))) 

    )) 
    (list min mid max) 
) 
+0

真正的好奇心:你認爲'progn'有什麼用? – coredump

+0

我認爲預測是不能發揮功能,但我不確定.... –

+1

downvoted因爲代碼沒有縮進/格式在任何有用的方式。這是不可讀的。 –

回答

1

比隨機打字,希望它的工作原理相反,一個好的辦法是寫下來,在英語,你需要實現訂購三個數字的算法。那麼,如果你幸運的話,你可以直接把它變成代碼。

所以

要訂購,B,C:

  • 如果如果<一個< = C
    • = B(A是最不重要的,我們需要訂購b和c )
      • 若b < = C答案是ABC,否則答案是ACB
    • 其他(一個< = c和A> B,我們有一個數量級)的答案是BAC
  • 否則(A> C)
    • 若B < = C(A> C和b < = C,所以我們有一個訂單)的答案是BCA
    • 否則(A> C,b> C,我們需要訂購和b)
      • 如果< = b的答案是駕駛室別人的答案是CB一個

現在把它轉換成Lisp的。記住if的語法是(if test true-result false-result),其中true-resultfalse-result是表達式。

2

這裏是一個可能的解決方案:

(defun order (min mid max) 
    (when (< mid min) 
    (rotatef mid min)) 
    (if (< max min) 
     (rotatef max mid min) 
     (when (< max mid) 
     (rotatef mid max))) 
    (list min mid max)) 

首先,我們假設三個參數都已經在正確的順序,如果這不是真的,我們改變他們通過使用rotatef,原始功能交換兩個變量或旋轉三個或更多變量。

第一when校正,如果必要的話,minmid,交換它們之間的相對順序,如果是mid小於min

當我們知道min實際上比mid少,我們儘量把max在正確的地方是這樣的:

  • 第一,如果是小於min,這意味着它是三個小,又適當旋轉三個變量,

  • 否則,它可能是minmid之間,在這種情況下,我們交換midmax變量。如果它大於或等於mid,則不必進行交換,並且三個變量已按正確順序包含值。

相關問題