我需要检查给定的数字列表(所有数字)是否可以被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)))
答案 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;
)))