定义功能'映射'它有两个参数:一个SIMPLE列表L和一个整数值val。列表L的每个元素都是两个原子的列表 - 键和对象。该函数返回键小于val的对象列表。
实施例: (映射'((12k)(7n)(23r)(9p))13) - > (k n p)
我的代码:
(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 :(得分:0)
使用高阶函数编写你想要的东西真的很容易,你不需要所有这些嵌套的IF。
(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)
如果你必须重复一次递归:
(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)