从另一个列表的原子在LISP中构建列表
定义包含两个参数的函数“映射”:一个简单列表L和一个整数值val。列表L的每个元素都是两个原子的列表–键和对象。函数返回键小于val的对象列表 例如: (映射“((12K)(7N)(23R)(9P))13-->(KNP) 到目前为止,我的代码是:从另一个列表的原子在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
(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,这显然是一个赋值。出于教学方面的原因,评估员可能希望学生使用到目前为止所学的特征。这是合理的。