获取每个列表的最后元素

时间:2009-09-29 12:13:14

标签: lisp element

我们说我有一个列表((3 4 5) (d e f) (h i j) (5 5 5 5))

如何以这样的方式获取每个列表的最后一个元素(5 f j 5)?

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分: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)
  9. 从这里我们可以开始编写代码:

    ;; 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中所有附近的Dang通过这种方式解决。

    我接受所有问题的原因是将其分解为我担心的部分。如果我被赋予任务“如何对列表中的每个项目执行foo?”我应该回答这些问题:我如何处理null?如何处理原子?如何处理列表中的第一个元素?我该如何处理其他一切?一旦我回答了这个问题,那么我就会弄清楚如何真正做到foo。我怎么做null?我如何对原子做foo?我如何在名单上做foo?

答案 2 :(得分:0)

编写一个返回列表最后一个元素的过程,然后了解一下内置的MAP(a.k.a。MAPCAR)过程,看看是否有任何灯泡熄灭。

答案 3 :(得分: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

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

答案 4 :(得分: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的初学者,我发布了我的解决方案。