Recursion 列表中相同原子元素的数量,如(a(a b)(b c))

Recursion 列表中相同原子元素的数量,如(a(a b)(b c)),recursion,numbers,scheme,Recursion,Numbers,Scheme,我想向您寻求以下方面的帮助: 当我在列表上应用一个元素数的过程时,我需要得到一个对的列表,在对的第一位是元素,在第二位(点之后)是列表中出现的元素数 例如,键入以下内容时: (number-of-elements '((a b c) a (b c) c (a b b))) (number-of-elements '((a b c) a (b c) c (a b b))) 我明白了: ((a . 3) (b . 4) (c . 3)) (((a b c) . 1) (a . 1) ((b c

我想向您寻求以下方面的帮助:

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

例如,键入以下内容时:

(number-of-elements '((a b c) a (b c) c (a b b)))
(number-of-elements '((a b c) a (b c) c (a b b)))
我明白了:

((a . 3) (b . 4) (c . 3))
(((a b c) . 1) (a . 1) ((b c) . 1) (c . 1) ((a b b) . 1))
到目前为止,我有一个在常规列表(abaad)上工作的代码

但如果我用在:

我明白了:

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

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

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

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

=> '((a . 3) (b . 4) (c . 3))
如果您的解释器没有定义展平,则很容易实现:

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

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

请发布您迄今为止编写的代码,指出实现中的具体问题。我发布了您要求的代码。谢谢。太好了,现在它可以工作了:-)我只是多放了一点代码,这样就不需要写了(元素的数量(flatte’(…,但只是第一个过程。我喜欢你的
flatte
:)