在 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)
。
如果我有一个包含 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)
。