在 Scheme 中生成一个倍数列表

Generate a list of multiples in Scheme

如果我有一个包含 n 个数字的列表,并且只想生成一个新列表,其中的数字是同一列表中任何其他数字的倍数。

例如,对于此列表:'(2 4 5 7 10) 结果应为列表 '(4 10)

如果我们把问题分成几个部分会更容易。首先,让我们定义 是一个倍数 对我们意味着什么,并编写一个实现我们的定义的过程:

(define (is-multiple? num x)
  (and (not (= num x))
       (zero? (modulo num x))))

现在,让我们应用现有过程来迭代我们的输入并找到答案:

(define (only-multiples lst)
  (filter (lambda (num)
            (ormap (curry is-multiple? num) lst))
          lst))

它按预期工作:

(only-multiples '(2 4 5 7 10))
=> '(4 10)
#lang racket
(require math)

(define numbers '(2 4 5 7 10))

(define (count-divisors-in-numbers n)
  ; count how many numbers d in the list numbers, are a divisor of n.
  (for/sum ([d numbers] #:when (divides? d n)) 1))

(define (multiple-of-other? n)
  ; Note: a number is always a multiplum of it self,
  ;       so only if the count is greater than 1,
  ;       the number is a multiplum of another number
  (> (count-divisors-in-numbers n) 1))

(filter multiple-of-other? numbers)

结果是'(4 10)