如何检查给定列表是否可以在方案中被4整除

时间:2017-03-24 16:42:56

标签: scheme racket

我需要检查给定的数字列表(所有数字)是否可以被4整除

(divisible4 '(4,12,20))
#t

(divisible4 '(12 5 13))
#f

我写过这个,但它没有返回#f。我该如何解决这个问题

(define (div2? list)
  (if (= (modulo (car list) 4) 0)
      #t
      (div2? cdr list)))

2 个答案:

答案 0 :(得分:1)

一种简单的方法是使用内置函数,例如andmap来检查某个条件是否适用于列表中的所有元素:

(define (divisible4 lst)
  (andmap (lambda (e) (zero? (modulo e 4)))
          lst))

我们可以手工完成同样的过程,虽然不太优雅:

(define (divisible4 lst)
  (if (null? lst)
      #t
      (and (zero? (modulo (car lst) 4))
           (divisible4 (cdr lst)))))

等效地:

(define (divisible4 lst)
  (or (null? lst)
      (and (zero? (modulo (car lst) 4))
           (divisible4 (cdr lst)))))

无论如何,它按预期工作:

(divisible4 '(4 12 20))
=> #t
(divisible4 '(12 5 13))
=> #f

答案 1 :(得分:0)

命名让递归可能更容易理解:

(define (div4 L)
  (let loop ((ll L))                       ; set up recursion and initial value; 
    (cond
      [(empty? ll)                     #t] ; if full list tested, return true;
      [(not(= 0 (modulo (car ll) 4)))  #f] ; if first item is not divisible, return false; 
      [else              (loop (rest ll))] ; else goto rest of list;
      )))