查找列表中的元素是否整数?

时间:2012-07-23 21:01:24

标签: scheme

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

4 个答案:

答案 0 :(得分:3)

  (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"))))

答案 1 :(得分:2)

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

有几种方法可以执行上述操作,最直接的方法是在列表中重复测试每个元素,如果找到非整数元素则返回falsetrue如果全部消耗列表时没有找到非整数元素,如下所示:

(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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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