2017-03-07 38 views
-2
(defun bubbleUp (n) 
    (cond 
    ((null n) nil) 
    ((null (cdr n)) n) 
    ((> (car n) (car (cdr n))) 
    (append (list (car (cdr n))) 
      (bubbleUp (cons (car n) (cdr (cdr n)))))) 
    (t (append (list (car n)) (bubbleUp (cdr n)))))) 

我想寫一個使用該bubbleUp功能的排序功能。LISP程序

的調用進行排序將輸出如下:

> (sort ‘(5 4 3 2 1)) > (1 2 3 4 5) 

> (sort ‘(6 4 3 9 8)) 

> (3 4 6 8 9) 

但Ijust要使用LISP功能:defun定義,標準條件,汽車,CDR,列表,利弊,追加,>,<,> =,< =,=和null。我dn't想用(setq和設置)

+0

您應該先閱讀LISP的'sort','defun','cond','car','cdr','list'等文檔。網上有很多文檔和例子。然後嘗試並詢問你遇到困難的具體問題。 – lurker

回答

0

據我理解你的問題,你必須申請bubble-up(將命名功能更lispy方式),直到(apply #'< sorted-list)是真的再次,在sorted-list是結果爲bubble-up

當然,這只是一個作業解決方案,如果性能可能成爲問題,則不應使用該解決方案。此外,你應該想想,如果是聰明的讓你的功課SO ;-)

我想完成的,最簡單的模式是這樣(把你的函數泡沫式給出):

(defun bubble-sort (list) 
    (cond ((apply #'< list) list) 
     (t (bubble-sort (bubble-up list))))) 

CL-USER> (bubble-sort '(6 4 3 9 8 10 1 12)) 
==> (1 3 4 6 8 9 10 12) 

但是要注意,我不是一個非常有經驗的Lisp程序員,這個代碼是非常低效的。如果你真的想排序列表,你應該使用排序,並閱讀更多關於tail-call-optimization和iteration。信息標籤有更多的資源。

+0

你能指導我嗎?我是LISP編程的新手。我知道如何在C中做到這一點,但我不知道如何在LISP中做。我被卡住了。如果你能幫助我,我會非常感激。 – rajat