【问题标题】:Number of same atomic elements in a list like (a (a b) (b c))列表中相同原子元素的数量,例如 (a (a b) (b c))
【发布时间】:2016-01-16 22:21:37
【问题描述】:

我想就以下问题向您寻求帮助:

当我在列表上应用一个过程元素数时,我需要得到一个对的列表,其中在对中的第一位是元素,在第二位(点之后)有一个列表中出现的元素数。

例如,输入以下内容时:

(number-of-elements '((a b c) a (b c) c (a b b)))

我知道了:

((a . 3) (b . 4) (c . 3))

到目前为止,我有一个处理常规列表 (a b a d) 的代码。

(define number-of-elements
 (lambda (lst)
  (define exclude
  (lambda (sznm key)
    (foldr (lambda (ass result)
             (if (equal? (car ass) key)
                 result
                 (cons ass result)))
           '()
           sznm)))
(foldr (lambda (key bag)
         (cond ((assoc key bag)
                => (lambda (old)
                     (let ((new (cons key (+ (cdr old) 1))))
                       (cons new (exclude bag key)))))
               (else (let ((new (cons key 1)))
                       (cons new bag)))))
       '()
       lst)))

但如果我使用它:

(number-of-elements '((a b c) a (b c) c (a b b)))

我知道了:

(((a b c) . 1) (a . 1) ((b c) . 1) (c . 1) ((a b b) . 1))

我知道我需要使用深度递归,但我不知道如何将它实现到我实际拥有的代码中。

【问题讨论】:

  • 请贴出你目前写的代码,指出具体的实现问题。
  • 我发布了您要求我提供的代码。谢谢。

标签: recursion numbers scheme


【解决方案1】:

您已经完成了计算元素的大部分工作 - 但请参阅 bagify 的不同实现以获得更简单的实现。处理嵌套子列表的一种直接解决方案是在计算元素之前flatten 输入列表:

(number-of-elements
 (flatten
  '((a b c) a (b c) c (a b b))))

=> '((a . 3) (b . 4) (c . 3))

如果您的解释器没有定义flatten,则很容易实现:

(define (flatten lst)
  (if (not (list? lst))
      (list lst)
      (apply append (map flatten lst))))

这是Scheme中思考解决方案的惯用方式:将问题分解为部分,然后使用内置程序解决每个子部分,最后将它们组合起来。

【讨论】:

  • 太好了,现在可以了.
  • 我喜欢你对flatten 的实现:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 2015-06-12
  • 2011-12-23
  • 1970-01-01
  • 2020-07-15
相关资源
最近更新 更多