【问题标题】:Building a List in LISP from the atoms of another list从另一个列表的原子在 LISP 中构建一个列表
【发布时间】:2014-11-03 00:39:06
【问题描述】:

定义函数'mapping',它有两个参数:一个简单的列表L,和一个整数值val。列表 L 的每个元素都是两个原子的列表——键和对象。该函数返回一个 key 小于 val 的对象列表。

示例: (映射'((12 k) (7 n) (23 r) (9 p)) 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 语句没有返回我期望的所有值的列表。

【问题讨论】:

  • 由于这是一个作业,我没有给出完整的答案 (cons (car(cdr list)))- cons 需要两个参数。你只给了一个。什么才是好的第二个论点?
  • 第二个参数应该是剩余的值小于val的键。
  • 对。所以你需要做出改变……

标签: lisp


【解决方案1】:

使用高阶函数编写你想要的东西真的很容易,你不需要所有这些嵌套的 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)

【讨论】:

  • 不幸的是我不能使用高阶函数,因为我们没有在 LISP 中学习过这样的函数。我不知道 lambda 或 mapcan 是什么。
  • @RodEden,您不允许查看文档吗?我以任何方式为您添加了递归变体,请参阅编辑后的答案。
  • @coredump,这显然是一项任务。出于教学原因,评估员可能希望学生使用他们迄今为止所学的功能。这是合理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 2018-06-20
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多