【问题标题】:Generate a list of multiples in Scheme在 Scheme 中生成倍数列表
【发布时间】:2015-11-30 18:45:25
【问题描述】:

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

例如,对于这个列表:'(2 4 5 7 10),结果应该是列表'(4 10)

【问题讨论】:

    标签: list scheme racket


    【解决方案1】:

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

    (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)
    

    【讨论】:

      【解决方案2】:
      #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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 2017-03-06
        相关资源
        最近更新 更多