列表位置 n 中的元素是什么



我有这个函数,它给了我列表中给定位置的元素,需要用cond而不是if重写它。我还想稍微更改一下,这样如果我给一个负值,它就会返回nil,例如

(getn 2 '(a b c)) => (c)
(getn -1 '(a b c)) => nil

功能:

(defun getn (n lst)
(if 
(zerop n)
(car lst)
(getn (1- n) (cdr lst)) ) )

我做到了,但没有奏效:

(defun getn (nb liste)
(cond
((= 0 nb) liste)
(getn (1- n) (cdr liste)) )

您的第一个版本几乎是正确的。请注意,当您递归调用getn时,您正在缩短列表,因此会有一个点将nil作为lst参数传递。你必须先检查这个条件,如果lst为nil,则返回nil
cond类似于顺序if的列表。在你的情况下,你可以写:

(cond ((null lst) nil)
((< n 0) nil)
((= n 0) (car lst))
...
)
(defun getn (n lst)
(cond ((or (null lst) (< n 0)) nil)
((= n 0) (car lst))
(t (getn (- n 1) (cdr lst)))))

对于列表的第n个元素本身是CCD_,在lisp中,通常会发送附加信息。第二个值CCD_,如果找到元素则为nil。所以nil; t表示第n个元素是nil,而nil; nil表示没有元素已找到。

(defun getn (n lst)
(cond ((or (null lst) (< n 0)) (values nil nil))
((= n 0) (values (car lst) t))
(t (getn (- n 1) (cdr lst)))))
[8]> (getn 1 '(1 nil 3))
NIL ;
T
;; an element was found -> T as second value, and the element was `nil`
[9]> (getn 1 '(1))
NIL ;
NIL
;; no element was found -> nil as second value, and therefore first value is also `nil`.

学习lisp递归思维和编程的一本非常好的书是The little schemer或旧版本the little lisper。我通过递归思维学到了这一点。

最新更新