Lisp列表元素的数量

时间:2013-12-15 18:53:49

标签: lisp common-lisp

我为即将到来的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)))))

4 个答案:

答案 0 :(得分:1)

使用标签制作帮手。您有列表和索引作为参数。如果列表为空,则返回未找到的任何内容,也许为零。如果不是,则使用搜索词检查第一个元素,如果匹配则返回索引。如果不是,则重复使用列表的其余部分和索引的增量。

答案 1 :(得分:0)

您的问题描述和代码都很混乱。

让我们选择名称no-nth和参数订单n,然后list

所以你有3种不同的情况:

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

    (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,如果你想要一个零基索引元素)。