Lisp:返回列表中元素的前置项的函数

Lisp:返回列表中元素的前置项的函数,lisp,Lisp,这是我的想法- -我试图找到返回特定元素长度的函数,但由于缺乏语法知识,我无法使用该函数。 -通过使用length函数作为助手函数,我试图在列表中查找元素的前置项 我希望这能给你们一些想法,或者如果你们有更好的想法,请让我知道,也请显示编码 谢谢大家! 执行此操作并不特别需要length函数 显而易见的经典方法是,如果列表的cadr等于您想要的元素,则返回列表的car。否则,返回列表的cdr上的搜索功能。除此之外,您只需要处理边界条件(例如,列表为空或仅包含一项)。根据您当前的尝试,这里有一个更

这是我的想法- -我试图找到返回特定元素长度的函数,但由于缺乏语法知识,我无法使用该函数。 -通过使用length函数作为助手函数,我试图在列表中查找元素的前置项

我希望这能给你们一些想法,或者如果你们有更好的想法,请让我知道,也请显示编码


谢谢大家!

执行此操作并不特别需要
length
函数


显而易见的经典方法是,如果列表的
cadr
等于您想要的元素,则返回列表的
car
。否则,返回列表的
cdr
上的搜索功能。除此之外,您只需要处理边界条件(例如,列表为空或仅包含一项)。

根据您当前的尝试,这里有一个更正版本(附带更正的缩进,作为奖励:-):

如果未找到所需元素,是否确实要返回列表的最后一个元素?看起来…奇怪,我认为零是一个更好的回报值


更新:OP希望实现后续和前置功能。下面是我将如何在Scheme中实现它们。(很抱歉,没有为您做家庭作业,但如果您知道如何将Scheme转换为Common Lisp,您的生活会更轻松。)

虽然
memv
内置于Scheme中,但您可以自己简单地实现它:

(define (succ x lst)
  (cond ((memv x lst) => (lambda (mem)
                           (and (pair? (cdr mem))
                                (cadr mem))))
        (else #f)))

(define (pred x lst)
  (let loop ((prev #f)
             (rest lst))
    (cond ((null? rest) #f)
          ((eqv? (car rest) x) prev)
          (else (loop (car rest) (cdr rest))))))

特别是,请注意
memv
pred

之间的相似性。下面是我的尝试(尽管有很多错误),并且假设列表至少有一个元素。你是最棒的!谢谢你!所以,对于后继者,我需要更改第三行的(car l),我尝试了car(cdr(cdr l))。。。但是我没有得到想要的结果..对不起,我很困惑(@user123378您是想找到前任还是继任者?您的问题是关于前任的。找到继任者涉及一种完全不同但更简单的方法。@user123378您发布的示例是Previous。请务必阅读关于接受对您最有帮助的答案以及为什么要这样做的内容。搜索上面SO任务栏中的“帮助”。
(defun pred (x l)
  (cond ((null (cdr l)) (car l))
        ((eq (cadr l) x) (car l))
        (t (pred x (cdr l)))))
(define (succ x lst)
  (cond ((memv x lst) => (lambda (mem)
                           (and (pair? (cdr mem))
                                (cadr mem))))
        (else #f)))

(define (pred x lst)
  (let loop ((prev #f)
             (rest lst))
    (cond ((null? rest) #f)
          ((eqv? (car rest) x) prev)
          (else (loop (car rest) (cdr rest))))))
(define (memv x lst)
  (let loop ((rest lst))
    (cond ((null? rest) #f)
          ((eqv? (car rest) x) rest)
          (else (loop (cdr rest))))))