首页 > 解决方案 > 编写一个函数,它吃一个 Nat 并返回一个 (listof Nat),其中包含 1 和 n 之间的数字,这些数字可以被 2、3 和 5 中的一个整除

问题描述

编写一个函数 (fff n),它使用一个 Nat 并返回一个 (listof Nat),其中包含 1 和 n 之间的所有数字,这些数字恰好可以被 2、3 和 5 中的一个整除。

当 n = 10 时,可被这些值中的至少一个整除的数字是 {2,3,4,5,6,8,9,10}。

但是 6 和 10 可以被其中两个数整除。所以 (fff 10) => (列表 2 3 4 5 8 9)

到目前为止我所拥有的是

;; q2

;;(divisible? n d) returns true if no remainder exists when d is divided by n
;;divisible?: Nat-> Num
;;Examples

(check-expect (divisible? 8 4) #true )

(define (divisible? n d) (= 0 (remainder n d)))

;;
(define (multiple-235? n)
  (cond
   ((divisible? n 2) #true)
   ((divisible? n 3) #true)
   ((divisible? n 5) #true)))

我不确定如何设置要检查的 1 到 n 的范围,我也不确定如何过滤列表以仅包含可被 2、3 或 5 整除的值。如何将其设置为仅能被其中之一整除。

标签: listracket

解决方案


Just use filter and fix your multiple-235? using PetSerAl's approach (or use his solution):

(define (multiple-235? n)
  (= 1 (count (λ (d) (divisible? n d))
              '(2 3 5))))

(define (fff n)
  (filter multiple-235? (range 1 (add1 n))))

推荐阅读