recursion - 合并 2 组间隔

标签 recursion scheme racket

我有一个联合方法设置来组合两组有序间隔:

(define (union set1 set2)
  (cond [(empty? set1) set2]
        [(empty? set2) set1]
        [(< (caar set1) (caar set2)) (cons (car set1) (union (cdr set1)
                                                             set2))]
        [else (cons (car set2) (union set1
                                      (cdr set2)))]))

给定 2 个列表 '((1 3) (5 10) (19 29))'((2 4) (17 25) (30 49)) 他们生产

'((1 3) (2 4) (5 10) (17 25) (19 29) (30 49)) 与上面的代码。

但是通过上述实现,重叠间隔没有得到正确处理。我需要合并重叠间隔以生成 '((1 3) (2 4) (5 10) (17 29) (30 49))。我该如何处理这些间隔合并以避免重叠?

最佳答案

假设您使用半开区间[from upto),Racket 提供 interval-map模块:

An interval-map is a mutable data structure that maps half-open intervals of exact integers to values. An interval-map is queried at a discrete point, and the result of the query is the value mapped to the interval containing the point.

提供的示例:

> (define r (make-interval-map))
> (interval-map-set! r 1 5 'apple)
> (interval-map-set! r 6 10 'pear)
> (interval-map-set! r 3 7 'banana)
> (dict-map r list)
'(((1 . 3) apple) ((3 . 7) banana) ((7 . 10) pear))

使用示例输入 '((1 3) (5 10) (19 29))'((2 4) (17 25) (30 49)):

#lang racket/base
(require data/interval-map
         racket/list
         racket/match
         racket/dict)

(define im (make-interval-map))

;; Add your first set
(for ([x '((1 3) (5 10) (19 29))])
  (interval-map-set! im (first x) (second x) #f))

;; Add your second set
(for ([x '((2 4) (17 25) (30 49))])
  (interval-map-set! im (first x) (second x) #f))

;; The result
(map car (dict-map im list))
;; => '((1 . 2) (2 . 4) (5 . 10) (17 . 25) (25 . 29) (30 . 49))

关于recursion - 合并 2 组间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22289302/

相关文章:

scheme - LISP 中以索引作为参数之一的映射函数

arrays - 二维数组的递归遍历以找到唯一路径

c - 递归如何在 C 中工作

scheme - 返回所有其他元素列表的方案过程

scheme - Racket R6RS支持: syntax-case

racket - 如何独立测试 Racket 包?

function - 该函数未定义。 (递归)

c++ - 在 C++ 中使用递归函数反转字符串

lisp - 在 Windows 中试用 "The Little Schemer"书中的示例

scheme - 在初学者方案中,我如何将变量表示为字符串?