You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Racket中实现支持自定义相似性判定的列表去重函数

Racket 支持自定义相似性判定的列表去重函数实现

核心实现思路

  • 采用尾递归遍历原列表,同时维护已保留元素的集合作为中间状态
  • 对每个当前遍历的元素,通过传入的相似性函数判断是否已在已保留集合中出现过
  • 未出现过则加入保留集合,否则跳过,最终反转中间集合得到保持原顺序的去重结果
  • 默认使用eq?作为相似性判定函数,支持用户传入自定义对称判定函数

完整代码实现

(define (remove-duplicates* lst [same? eq?])
  (let loop ([remaining lst]  ; 剩余待遍历的元素
             [seen '()])      ; 已确认保留的元素集合
    (cond
      [(empty? remaining) (reverse seen)]
      [else
       (define current (car remaining))
       ; 检查当前元素是否已经出现在保留集合中
       (if (ormap (lambda (x) (same? x current)) seen)
           (loop (cdr remaining) seen)
           (loop (cdr remaining) (cons current seen)))])))

使用示例

  1. 默认eq?判定去重
(remove-duplicates* '(1 2 2 3 'a 'a 4))
; 输出:'(1 2 3 'a 4)
  1. 自定义大小写不敏感的字符串去重
(remove-duplicates* '("apple" "Apple" "banana" "APPLE") string-ci=?)
; 输出:'("apple" "banana")
  1. 按绝对值相等对数值列表去重
(remove-duplicates* '(1 -1 2 3 -2) (lambda (a b) (= (abs a) (abs b))))
; 输出:'(1 2 3)

内容的提问来源于stack exchange,提问作者Danilobol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 06:06:06