【问题标题】:How can I tell if a list has a third item?如何判断列表是否包含第三项?
【发布时间】:2009-03-19 22:20:07
【问题描述】:

我有一个函数,它接受一个包含两个或三个元素的列表。

;; expecting either ((a b c) d) or ((a b c) d e)
(define (has-third-item ls)
      (if (null? (caddr ls))
          false
          true)
      )

但是这段代码失败了

mcar: expects argument of type <mutable-pair>; given ()

在 (null? (caddr ls)) 表达式上。

我也试过

(eq? '() (caddr ls))

但它也没有工作。如何判断是否有第三项?

【问题讨论】:

  • 只是好奇。请问这是什么语言?

标签: lisp scheme


【解决方案1】:

你不想要 caddr,你想要 (if (null? (cddr ls)) ... 或者只是使用 length 来查找列表的长度,并将其与您感兴趣的值进行比较。

终止列表的 '() 将始终位于一对的 cdr 位置,因此在 car 位置查找它(cad+r 会这样做)不会有效率。

【讨论】:

    【解决方案2】:

    问题是,如果您有一个包含两个或更少项目的列表,您就不能获取它的 caddr。试试这个:

    (define (has-third-item lst)
      (<= 3 (length lst)))
    

    在某些情况下,获取列表的长度可能是低效的(例如包含数百万个项目的列表);在这种情况下,我们可以手动测试列表的长度是零、一还是二:

    (define (has-third-item lst)
      (not (or (null? lst)
               (null? (cdr lst))
               (null? (cddr lst)))))
    

    编辑:关于two other 的答案,虽然在这种情况下使用cddr 可能会起作用,因为输入域由具有两个或三个元素的列表组成,has-third-item对于零或一的列表仍然会失败。为了通用性,我建议使用适用于任何领域的解决方案。

    【讨论】:

      【解决方案3】:

      如果你知道你的列表有两个或三个元素(正如你所说的那样),你可以这样做

      (define (has-third-item? l)
        (not (null? (cddr l))))
      

      您正在检查第二个 cons 单元格 (cddr l) 是否有 cdr。您不必检查 l 本身是否为 null 或 l 只有一个元素,除非您想要更通用的函数。

      【讨论】:

        【解决方案4】:

        试试……

        (and l (cdr l)(cddr l))
        

        【讨论】:

          【解决方案5】:

          为什么不用(第三个ls)

          如果不存在,则返回第三个元素或 NIL。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-10
            • 1970-01-01
            • 2011-03-01
            • 2019-08-17
            • 1970-01-01
            • 1970-01-01
            • 2018-08-10
            • 2012-05-17
            相关资源
            最近更新 更多