我为即将到来的LISP考试做好准备,而且我遇到了一个无法解决的问题,所以我希望有经验的人可以帮助我。我试图制作一个递归的lisp程序,它从列表中返回一个元素n的位置但是我不能使用nth.I需要验证n是否在0和列表长度之间的列表中-1如果该元素不在列表中则是错误消息应该出现。
这样的事情:(my-list '(1 2 3) 4) =>"error the list has only 3 elements"
有人可以帮助我解决这个问题我还是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)))))
答案 0 :(得分:1)
使用标签制作帮手。您有列表和索引作为参数。如果列表为空,则返回未找到的任何内容,也许为零。如果不是,则使用搜索词检查第一个元素,如果匹配则返回索引。如果不是,则重复使用列表的其余部分和索引的增量。
答案 1 :(得分:0)
您的问题描述和代码都很混乱。
让我们选择名称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
答案 2 :(得分: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))))
答案 3 :(得分:0)
(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)))
如果您想查看结果:http://ideone.com/zW0gvD
首先检查索引是否有效,如果不是,则返回invalid-index。
如果它有效,你可以调用help-func,一个递归函数。
递归地,你减少n直到你得到n = 1(或n = 0,如果你想要一个零基索引元素)。