4

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

4

4 回答 4

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"))))
于 2012-07-23T21:57:39.590 回答
2

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

于 2012-07-23T21:18:28.907 回答
2

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

有几种方法可以完成上述操作,最直接的方法是在列表中依次测试每个元素,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
于 2012-07-23T21:30:16.430 回答
1

SRFI-1 使用术语everyandany而不是andmapand ormapmatch也可以使用:

(define list-of-integers?
  (lambda (lst)
    (match lst
           (((? number?) ..1) #t)
           (_ #f))))
于 2016-04-12T12:45:28.960 回答