5

假设我有一个清单((3 4 5) (d e f) (h i j) (5 5 5 5))

如何以输出看起来像这样 (5 fj 5) 的方式获取每个列表的最后一个元素?

4

5 回答 5

9

假设这是关于 Common Lisp,有一个函数last,它返回一个包含列表最后一项的列表。如果将此函数与mapcan一起使用,它将给定函数应用于列表的每个元素并返回连接的结果,你会得到你想要的。

请注意,虽然访问列表的最后一个元素是一项O(N)操作,所以如果这毕竟不仅仅是家庭作业,您可能需要考虑是否不能比获取每个列表的最后一项更有效地解决实际问题(也许改用另一个数据结构)。

于 2009-09-29T12:41:00.143 回答
3

这就像大多数早期的 LISPy 作业问题一样,是一种递归思考和/或归纳思考的练习。开始的方法是问自己简单的问题,你可以很容易地回答。

例如,如果你被要求写一些东西给你每个列表中的第一个元素,我会这样处理:

给定一个列表列表:

  1. 列表中每个列表的第一个元素是什么'()?(容易 - null
  2. 列表中每个列表的第一个元素是什么'(a)?(容易 - a,或者可能是一个错误)
  3. 列表中每个列表的第一个元素是什么'((a))?(容易 - (a)
  4. 表单中任何列表的第一个元素是什么'(anything),什么是列表?(容易 - (first anything)
  5. 表单中每个列表的第一个元素是什么'(anything morestuff)?(容易 - (cons (first anything) (first-element morestuff))
  6. 什么是原子的第一个?原子或错误(取决于您的观点)
  7. 什么是 null 的第一个?nil.
  8. 列表中的第一个是什么?(car list)

从这里我们可以开始编写代码:

;; here's first, meeting questions 6-8
(define first (lambda (l)
  (cond 
    ((null? l) nil) ; Q7
    ((atom? l) l)   ; Q6
    (t (car l)))))  ; Q8

;; with first we can write first-element, meeting questions 1-5
(define first-element (lambda (l)
  (cond
    ((null? l) nil) ; Q1
    ((atom? l) (first l))   ; Q2
    (t (cons (first (car l) (first-element (cdr l)))))))) ; Q4-5

现在这不是你的作业(故意)。你应该玩这个并了解它是如何工作的。你的下一个目标应该是找出这与你的任务有何不同以及如何到达那里。

关于 MAPCAR?别担心。您需要首先学习如何解决递归问题。然后你可以担心 MAPCAR。这个任务的意义是什么?帮助你学会在这种模式下思考。通过这种方式思考解决了 LISP/Scheme 中所有问题附近的问题。

我提出所有问题的原因是将其分解为我担心的部分。如果给我任务“我如何对列表中的每个项目执行 foo 操作?” 我应该回答以下问题:如何处理 null?如何处理原子?如何处理列表中的第一个元素?我如何处理其他一切?一旦我回答了这个问题,我就会弄清楚如何实际做 foo. 我如何在 null 上做 foo?我如何在原子上做 foo ?我如何在列表上做 foo ?

于 2009-09-29T16:08:03.030 回答
0

可能它已经解决了,但我想通了

; SELECT-FROM-INNER-LIST :: [list] -> [list]
(DEFUN SFIL (lst)
  (COND ((NULL lst) NIL)
        ((LISTP (FIRST lst)) (APPEND (LAST (FIRST lst)) (SFIL (REST lst))))
))

现在,这适用于合法列表......所以如果你用正确的列表调用函数 SFIL......如果不是,它将返回 NIL

希望这对任何找到它的人都有帮助

于 2010-03-13T17:45:10.047 回答
0

编写一个返回列表最后一个元素的过程,然后了解一些关于内置MAP(aka MAPCAR)过程的知识,看看是否有灯泡熄灭。

于 2009-09-29T12:28:48.563 回答
0
(defun get-last-lists (s)
    (setq rt 'nil)
    (loop for i from 0 to (- (length s) 1)
        do (setq rt (append rt (last (nth i s)))))
    (print rt))

作为 lisp 的初学者,我发布了我的解决方案。

于 2013-07-25T01:29:59.410 回答