假设我有一个清单((3 4 5) (d e f) (h i j) (5 5 5 5))
如何以输出看起来像这样 (5 fj 5) 的方式获取每个列表的最后一个元素?
这就像大多数早期的 LISPy 作业问题一样,是一种递归思考和/或归纳思考的练习。开始的方法是问自己简单的问题,你可以很容易地回答。
例如,如果你被要求写一些东西给你每个列表中的第一个元素,我会这样处理:
给定一个列表列表:
'()
?(容易 - null
)'(a)
?(容易 - a
,或者可能是一个错误)'((a))
?(容易 - (a)
)'(anything)
,什么是列表?(容易 - (first anything)
)'(anything morestuff)
?(容易 - (cons (first anything) (first-element morestuff))
)nil
.(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 ?
可能它已经解决了,但我想通了
; 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
希望这对任何找到它的人都有帮助
编写一个返回列表最后一个元素的过程,然后了解一些关于内置MAP
(aka MAPCAR
)过程的知识,看看是否有灯泡熄灭。
(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 的初学者,我发布了我的解决方案。