【发布时间】:2015-11-30 18:45:25
【问题描述】:
如果我有一个包含 n 个数字的列表,并且希望仅生成一个新列表,则该列表中的数字是同一列表中任何其他数字的倍数。
例如,对于这个列表:'(2 4 5 7 10),结果应该是列表'(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)。
【讨论】: