Lisp列出元素的编号

Lisp列出元素的编号,lisp,common-lisp,Lisp,Common Lisp,我正在为即将到来的LISP考试做准备,我遇到了一个无法解决的问题,因此,我希望有更有经验的人可以帮助我。我试图制作一个递归lisp程序,从列表中返回元素n的位置,但我不能使用n。我需要验证n是否在列表的0和长度之间-1如果元素不在列表中,则应显示错误消息。 类似这样的内容:(我的列表’(1 2 3)4)=>“错误列表只有3个元素” 有人能帮我解决这个问题吗?说到LISP,我还是个新手 到目前为止,我的代码是: (defun no-nth (n list) (declare (type (in

我正在为即将到来的LISP考试做准备,我遇到了一个无法解决的问题,因此,我希望有更有经验的人可以帮助我。我试图制作一个递归lisp程序,从列表中返回元素n的位置,但我不能使用n。我需要验证n是否在列表的0和长度之间-1如果元素不在列表中,则应显示错误消息。 类似这样的内容:
(我的列表’(1 2 3)4)=>“错误列表只有3个元素”
有人能帮我解决这个问题吗?说到LISP,我还是个新手

到目前为止,我的代码是:

(defun no-nth (n list)
  (declare (type (integer 0) n) (type list))
  (if (or (zerop n) (null list))
    (cons (car list) (no-nth (1- n) (cdr list)))))

使用标签创建辅助对象。您将列表和索引作为参数。当列表为空时,您将返回未找到列表时所做的任何操作,可能为零。如果不是,则使用搜索词检查第一个元素,如果匹配,则返回索引。如果没有,您将重复使用列表的其余部分和索引的增量。

您的问题描述和代码都会混淆

让我们先确定名称
no-nth
和参数顺序
n
,然后确定
list

因此,您有3种不同的情况:

  • n<0或列表为空=>找不到元素=>返回
    nil
  • n=0=>结果是列表的第一个元素(假设第一个位置是索引0)
  • n>0=>通过递减n并将列表缩短1来递归
  • 代码将是:

    (defun no-nth (n list)
      (cond
       ((or (< n 0) (null list)) nil)  ; (1) index not in list
       ((zerop n) (car list))          ; (2) index = 0 => return first element of list
       (t (no-nth (1- n) (cdr list))))); (3) index > 0 => recurse down
    
    (定义编号n(n列表)
    (续)
    ((或(返回列表的第一个元素
    (t(第n(1-n))(cdr list(()));;(3) 索引>0=>向下递归
    
    你想过这样的事情吗

    (defun no-nth (n list)
      (labels ((nth-intern (n list)
                 (if (zerop n) (car list)
                   (nth-intern (1- n) (cdr list)))))
        (if (< (list-length list) n)
            (error "LIST has no Nth element.")
          (nth-intern n list))))
    
    (定义编号n(n列表)
    (标签((第n个实习生)(n个列表)
    (如果(零位)(车辆列表)
    (第n实习医生(1-n)(cdr list(())))
    (如果(<(列表长度列表)n)
    (错误“列表没有第n个元素。”)
    (第n名实习生名单)
    
    (解除帮助功能(n列表)
    (续)
    (=n1)(车辆清单))
    (T(help func(1-n))(cdr list(())))
    (第n个(n个列表)
    (续)
    ((或(=n(长度列表)))的无效索引)
    (T(帮助功能列表)))
    (印刷品(第n个2'(1 2 3)))
    (印刷品(第21号)(1、2、3)))
    
    如果要查看结果,请执行以下操作:

    首先检查索引是否有效,如果无效,则返回无效索引。
    如果有效,则调用help func,这是一个递归函数


    递归地减少n直到n=1(或者n=0,如果你想要一个零基索引元素)。

    向我们展示你到目前为止的代码。(defun no n(n list)(declare(type(integer 0)n)(type list))(if(or(zerop n)(null list))(cons(car list)(no n(1-n)(cdr list(()))))这是iv到目前为止所做的,但它不起作用:(
    (defun help-func (n list)
    (cond
        ((= n 1) (car list))
        (T (help-func (1- n) (cdr list)))))
    
    (defun no-nth (n list)
    (cond
        ((or (< n 0) (>= n (length list))) 'invalid-index)
        (T (help-func n list))))
    
    (print (no-nth 2 '(1 2 3)))
    (print (no-nth 21 '(1 2 3)))