【问题标题】:Using Lisp: define a function that takes a list and a number and returns true if the number occurs in the list使用 Lisp:定义一个函数,该函数接受一个列表和一个数字,如果该数字出现在列表中,则返回 true
【发布时间】:2019-07-20 16:17:24
【问题描述】:

我是 lisp 的新手,我遇到了一个问题,我正在尝试在列表中查找号码,但它不起作用。我还没有做退货声明

(defun num (x 'y)
    (if (member x '(y)) 't nil))

(write (num 10 '(5 10 15 20)))

我的输出只是输出nil 而不是执行函数,我对自己做错了什么感到困惑。

【问题讨论】:

  • 我知道 Clojure,而不是 CL,但您将 y 包装在 (member x '(y)) 的第二个列表中。看起来应该只是(member x y)
  • 它没有用,同样的事情发生了。
  • 再说一次,我不知道 CL,但这有效:rextester.com/UVEWC78002。不知道为什么你在参数列表中引用了y

标签: lisp common-lisp


【解决方案1】:

解决方案

(defun member-p (element list)
  "Return T if the object is present in the list"
  (not (null (member element list))))

not/null 模式等价于(if (member element list) t nil),但更常见。

事实上,你并不真的需要这个单独的函数, member 够用了。

-p 后缀代表 谓词,参见。 integerpupper-case-p

您的代码

  1. 你不能引用lambda list元素,所以你需要用defun num (x y)替换defun num (x 'y)
  2. 你不需要引用t
  3. 引用'(y) 没有意义,将其替换为y
  4. 您不需要write 函数调用,REPL 会为您完成。

另见

【讨论】:

    【解决方案2】:

    几乎可以肯定,您不仅要使用member,还要编写一个满足您需要的函数(显然在现实生活中您只需要使用member,因为这就是它的用途)。

    所以。要知道一个对象是否在列表中:

    • 如果列表为空,则不是;
    • 如果列表的头部等于它的对象;
    • 否则,如果它在列表的尾部,则它在列表中。

    你可以很直接的把它变成一个函数:

    (defun num-in-list-p (n l)
      ;; is N in L: N is assumed to be a number, L a list of numbers
      (cond ((null l)
             nil)
            ((= n (first l))
             t)
            (t
             (num-in-list-p n (rest l)))))
    

    【讨论】:

      【解决方案3】:

      您可以使用内置的位置函数,如果它在列表中,它将返回数字的索引:

      (position 1 '(5 4 3 2 1))
      

      如果你想定义自己的函数:

      CL-USER> (defun our-member(obj lst)
         (if(zerop (length lst))
            nil
            (if(equal(car lst)obj)
            T
           (our-member obj (cdr lst)))))
      OUR-MEMBER
      CL-USER> (our-member 1 '(5 4 3 2 1))
      T
      CL-USER> (our-member 99 '(1 2 3 4 5))
      NIL
      

      我们可以创建一个名为“our-member”的函数,它将一个对象(在您的情况下为数字)和列表(在您的情况下为数字列表)作为参数。在这种情况下,我们的“基本情况”将是列表的长度是否等于零。如果是并且我们仍然没有找到匹配项,我们将返回 nil。否则,我们将检查列表的汽车(列表中的第一个元素)是否等于我们传递的 obj。如果是这样,我们将返回 T (true)。但是,如果不是,我们将再次调用该函数,将对象和列表的 cdr(列表的 car 之后的所有内容)再次传递给该函数,直到列表中没有任何项目。如您所见,调用此函数的第一个示例返回 T,第二个示例调用返回 NIL。

      这个实用函数之所以成为一个很好的例子,是因为它本质上也向您展示了成员函数的工作原理以及内部发生的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        • 2016-06-21
        • 2020-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多