【问题标题】:Find whether element in list integer?查找列表中的元素是否为整数?
【发布时间】:2012-07-23 21:01:23
【问题描述】:

我想知道,如何检查列表中的每个元素是否都是整数?我可以使用 (integer? (car list) 检查第一个元素,但如果我这样做 (integer? (cdr list)),它总是返回 false (#f),因为列表的最后一部分不是整数作为一个团队。 在这种情况下,假设列表定义为。 (定义列表'(1 2 5 4 5 3))

【问题讨论】:

    标签: scheme


    【解决方案1】:
      (define get-integers
        (lambda (x)
         (if (null? x)
            "All elements of list are integers"
            (if (integer? (car x))
                (get-integers (cdr x))
                "Not all elements are an integer"))))
    

    【讨论】:

    • 返回字符串而不是布尔值?使用嵌套的ifs 而不是cond?这个解决方案不是很惯用。
    • 为了清楚起见更好,因为这是为了展示这种方法背后的逻辑。
    【解决方案2】:

    Practical Schemes 提供了对整个序列进行测试的功能。例如,andmap 函数的应用程序将是合适的。 Racket 提供了一个for/and 来做类似的事情。如果你真的需要手动写出循环,你将使用递归。

    【讨论】:

      【解决方案3】:

      您需要做的是测试列表中的每个元素以查看它是否满足条件(在本例中为整数)。当您在整数列表上评估 (integer? (car list)) 时,您正在检查列表中的第一个元素是否为整数,这很好。但是表达式 (integer? (cdr list)) 测试 list 是否为整数(因为 cdr 返回一个列表),这不起作用 - 你需要测试 next列表中的元素,下一个,依此类推,直到列表为空。

      有几种方法可以完成上述操作,最直接的方法是在列表中依次循环测试每个元素,如果找到非整数元素,则返回 false,如果所有列表都已用完,则返回 true没有找到一个非整数元素,像这样:

      (define (all-integers? lst)
        (cond ((null? lst) #t)
              ((not (integer? (car lst))) #f)
              (else (all-integers? (cdr lst)))))
      

      更实用的方法是使用内置过程,如下所示:

      (andmap integer? lst)
      

      andmap 将检查lst 中的所有元素是否针对给定谓词计算为true。例如:

      (andmap integer? '(1 2 3))
      > #t
      
      (andmap integer? '(1 "x" 3))
      > #f
      

      【讨论】:

        【解决方案4】:

        SRFI-1 使用术语everyany 而不是andmapormapmatch也可以用:

        (define list-of-integers?
          (lambda (lst)
            (match lst
                   (((? number?) ..1) #t)
                   (_ #f))))
        

        【讨论】:

          猜你喜欢
          • 2014-12-07
          • 1970-01-01
          • 2013-09-23
          • 2011-04-24
          • 2020-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-17
          相关资源
          最近更新 更多