【问题标题】:What's the element in position n of a list列表中位置 n 的元素是什么
【发布时间】:2020-11-09 11:46:49
【问题描述】:

我有这个函数,它给我一个列表中给定位置的元素,需要用 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)) )

【问题讨论】:

    标签: lisp common-lisp clisp


    【解决方案1】:

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

    (cond ((null lst) nil)
          ((< n 0) nil)
          ((= n 0) (car lst))
          ...
    )
    

    【讨论】:

    • 非常感谢您的澄清!我的问题也来自于我需要用 cond (而不是 if)来编写它,而且我遇到了从一个到另一个的问题,因为我还不太熟悉 lisp。
    【解决方案2】:
    (defun getn (n lst)
      (cond ((or (null lst) (< n 0)) nil)
            ((= n 0) (car lst))
            (t (getn (- n 1) (cdr lst)))))
    

    对于这种情况,列表的第 n 个元素本身就是nil, 在 lisp 中,通常会发送附加信息。第二个值,即t, 如果找到一个元素,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。我通过它学习递归思考。

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多