2014-11-02 43 views
0

定義具有2個參數的函數'映射':SIMPLE列表L和一個整數值val。列表L中的每個元素都是兩個原子的列表 - 鍵和對象。該函數返回鍵值小於val的對象列表。在LISP中從另一個列表的原子構建列表

實施例: (映射「((12 K)(7 N)(23 R)(9 P))13) - >(KNP)

到目前爲止我的代碼:

(defun mapping (list val) 
    (if (consp list) ;;if list is not empty 
     (if (> val (caar list)) ;; check the first value in the first nested list 
      (cons (car(cdr list)));;if value is greater add that value to the return list 

    (mapping (cdr list) val)))) ;; recurse thru the list 

我的代碼有語法錯誤以及cons語句沒有返回我期望的所有值的列表。

+0

因爲這是一個任務,我不給一個completel回答'(缺點(汽車(CDR列表)))' - '利弊'有兩個參數。你只給一個。什麼會成爲一個好的第二個論點? – 2014-11-02 16:22:29

+0

第二個參數應該是其值小於val的其餘鍵。 – 2014-11-02 16:31:11

+0

對。所以你需要做出一些改變... – 2014-11-02 16:49:00

回答

0

使用高階函數編寫你想要的東西真的很容易,你不需要所有這些嵌套的IFs。

(defun mapping (list val) 
    (mapcan 
    (lambda (el) 
     (if (> val (car el)) 
     (cdr el) 
     nil)) 
    list)) 

CL-USER> (mapping '((12 k) (7 n) (23 r) (9 p)) 13) 
(K N P) 

如果你有wtite recursice之一:

(defun recursive-mapping (list val) 
    (cond 
    ((null list) nil) 
    ((> val (caar list)) (cons (cadar list) 
           (recursive-mapping (cdr list) val))) 
    (t (recursive-mapping (cdr list) val)))) 

CL-USER> (recursive-mapping '((12 k) (7 n) (23 r) (9 p)) 20) 
(K N P) 
+0

不幸的是,我不能使用高階函數,因爲我們還沒有在LISP中學過這樣的函數。我不知道lambda或mapcan是什麼。 – 2014-11-02 16:36:29

+0

@RodEden,你不允許看文檔嗎?我以任何方式爲您添加了遞歸變體,請參閱編輯答案。 – coredump 2014-11-02 16:40:13

+0

@coredump,這顯然是一項任務。出於教學原因,評估者可能希望學生使用迄今爲止學到的功能。這是合理的。 – 2014-11-02 16:51:15