如何在Scheme中按基准值将列表划分为三个部分?
实现Scheme列表三分区函数
我来帮你补全这个用于将列表拆分为三个部分的Scheme函数,刚好匹配你需要的需求——返回包含三个列表的嵌套列表,分别对应小于基准值、等于基准值、大于基准值的元素。
完整实现代码
(define (partition lst item) (define (partition-iter lst less same greater) (cond ((null? lst) ; 反转列表以保持原列表中的元素*相对顺序* (list (reverse less) (reverse same) (reverse greater))) ((< (car lst) item) (partition-iter (cdr lst) (cons (car lst) less) same greater)) ((= (car lst) item) (partition-iter (cdr lst) less (cons (car lst) same) greater)) (else ; 大于基准值的情况 (partition-iter (cdr lst) less same (cons (car lst) greater))))) ; 初始化迭代器,三个累加列表都为空 (partition-iter lst '() '() '()))
代码细节解释
- 外层函数
partition:接收待分区的列表lst和基准值item,内部定义了递归迭代器partition-iter来处理核心逻辑。 - 迭代器
partition-iter:- 四个参数分别是:当前待处理的子列表
lst,以及三个累加列表less(存储小于基准值的元素)、same(存储等于基准值的元素)、greater(存储大于基准值的元素)。 - 当
lst为空时,反转三个累加列表(因为cons会把新元素添加到列表头部,反转后能还原原列表中元素的相对顺序),最后返回由这三个列表组成的嵌套列表。 - 分三个条件分支处理当前元素:
- 元素小于基准值:将元素加入
less列表,继续递归处理剩余子列表。 - 元素等于基准值:将元素加入
same列表,继续递归处理剩余子列表。 - 元素大于基准值:将元素加入
greater列表,继续递归处理剩余子列表。
- 元素小于基准值:将元素加入
- 四个参数分别是:当前待处理的子列表
- 初始调用:以空列表作为三个累加列表的初始值,启动迭代器开始处理。
示例使用
(partition '(1 3 2 5 3 4) 3) ; 返回结果:'((1 2) (3 3) (5 4))
内容的提问来源于stack exchange,提问作者user8928280
相关产品推荐
相关产品推荐

