Lisp列出元素的编号
我正在为即将到来的LISP考试做准备,我遇到了一个无法解决的问题,因此,我希望有更有经验的人可以帮助我。我试图制作一个递归lisp程序,从列表中返回元素n的位置,但我不能使用n。我需要验证n是否在列表的0和长度之间-1如果元素不在列表中,则应显示错误消息。 类似这样的内容: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
(我的列表’(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种不同的情况:
nil
(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)))