在Beginner Racket中实现类似Python collections.counter()的递归函数
递归实现符号列表频次统计函数(Scheme/Racket 环境)
原代码问题说明
现有代码的核心问题有两个:
- 全局变量
val的逻辑完全错误,每次递归只会统一加1,无法针对不同符号单独统计计数 - 没有重复符号合并逻辑,每遍历到一个元素就直接生成新的键值对,不会更新已有同符号的计数,最终会生成大量重复符号的独立条目
实现思路
要求必须使用递归实现,我们采用两层递归逻辑完成需求:
- 主函数递归遍历输入的符号列表,每拿到一个符号,就调用辅助函数更新当前的统计结果
- 辅助函数递归遍历已有的统计结果列表,找到对应符号就将计数加1,没找到就新增对应符号的统计条目
最终可运行代码
; 辅助函数:向统计列表中新增/更新指定符号的计数 (define (update-count count-list sym) (cond ; 统计列表为空,直接新增符号条目,计数为1 [(empty? count-list) (list (list sym 1))] [else (let ([current-entry (first count-list)]) (if (equal? (first current-entry) sym) ; 匹配到对应符号,计数加1后返回 (cons (list sym (add1 (second current-entry))) (rest count-list)) ; 未匹配到,继续遍历后续统计条目 (cons current-entry (update-count (rest count-list) sym))))])) ; 主统计函数 (define (counter los) (cond [(empty? los) empty] [else ; 先统计剩余列表的频次,再将当前符号更新到统计结果中 (update-count (counter (rest los)) (first los))]))
运行验证
输入命令:(counter (list 't 't 'c 'a))
输出结果:(list (list 't 2) (list 'c 1) (list 'a 1)),完全符合需求要求。
内容的提问来源于stack exchange,提问作者trinity
相关产品推荐
相关产品推荐

