2012-07-23 36 views
3

我在想,如何检查列表中的每个元素是否是整数?我可以通过使用(integer?(car list))来检查第一个元素,但是如果我这样做(integer?(cdr list),它总是返回false(#f),因为整个列表的最后部分不是整数为一组。 在这种情况下,让我们说列表被定义为。 (定义列表“(1 2 5 4 5 3))查找列表中是否包含元素?

回答

2
(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")))) 
+0

返回字符串而不是布尔值?使用嵌套'if's而不是'cond'?这个解决方案不是很习惯。 – 2012-07-24 04:24:08

+0

清晰度更好,因为这是展示此方法背后的逻辑。 – ewein 2018-03-08 00:36:15

1

实际计划用于跨整个序列做测试提供的功能。该andmap函数的应用如果你真的需要用手写出循环,你将使用递归。

2

你需要做的是测试每个元素该列表以查看它是否满足条件(作为in泰格,在这种情况下)。当您在整数列表上评估(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将检查在的所有元素针对给定的谓词评估为true。例如:

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

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

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

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