从另一个列表的原子在LISP中构建列表

从另一个列表的原子在LISP中构建列表,lisp,Lisp,定义包含两个参数的函数“映射”:一个简单列表L和一个整数值val。列表L的每个元素都是两个原子的列表–键和对象。函数返回键小于val的对象列表 例如: (映射“((12K)(7N)(23R)(9P))13-->(KNP) 到目前为止,我的代码是: (defun mapping (list val) (if (consp list) ;;if list is not empty (if (> val (caar list)) ;; check the first v

定义包含两个参数的函数“映射”:一个简单列表L和一个整数值val。列表L的每个元素都是两个原子的列表–键和对象。函数返回键小于val的对象列表

例如: (映射“((12K)(7N)(23R)(9P))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语句也没有返回我所期望的所有值的列表。

使用高阶函数编写所需内容非常容易,不需要所有这些嵌套的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)
如果您必须安装一个:

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

由于这是一项作业,我不会给出一个完整的答案
(cons(car(cdr列表))
-
cons
接受两个参数。你只给了一个。什么是好的第二个参数?第二个参数应该是值小于val.Right的剩余键。所以你需要做一个改变…不幸的是,我不能使用高阶函数,因为我们还没有在LISP中学习这种函数。“我不知道lambda或mapcan是什么。@RodEden,你不允许在文档中查看吗?”?我以任何方式为您添加了递归变量,请参见编辑的答案。@coredump,这显然是一个赋值。出于教学方面的原因,评估员可能希望学生使用到目前为止所学的特征。这是合理的。