add find-min/max
This commit is contained in:
parent
f4979c9e58
commit
2e259163aa
|
@ -31,3 +31,43 @@
|
|||
: (Option Int)
|
||||
-> (None {Int}))
|
||||
|
||||
(define (find-min/max [lst : (List X)] [<? : (→ Y Y Bool)] [extract-key : (→ X Y)]
|
||||
→ (Option (× X X)))
|
||||
(match lst with
|
||||
[Nil -> None]
|
||||
[Cons x1 rst ->
|
||||
(let ([y1 (extract-key x1)])
|
||||
(Some (find-min/max-accum rst <? extract-key x1 y1 x1 y1)))]))
|
||||
|
||||
(define (find-min/max-accum [lst : (List X)] [<? : (→ Y Y Bool)] [extract-key : (→ X Y)]
|
||||
[x-min : X] [y-min : Y] [x-max : X] [y-max : Y]
|
||||
→ (× X X))
|
||||
(match lst with
|
||||
[Nil -> (tup x-min x-max)]
|
||||
[Cons x2 rst ->
|
||||
(let ([y2 (extract-key x2)])
|
||||
(cond [(<? y2 y-min)
|
||||
(find-min/max-accum rst <? extract-key x2 y2 x-max y-max)]
|
||||
[(<? y-max y2)
|
||||
(find-min/max-accum rst <? extract-key x-min y-min x2 y2)]
|
||||
[else
|
||||
(find-min/max-accum rst <? extract-key x-min y-min x-max y-max)]))]))
|
||||
|
||||
(check-type
|
||||
(find-min/max (Nil {Int})
|
||||
(λ ([x : Int] [y : Int])
|
||||
(< x y))
|
||||
(λ ([x : Int])
|
||||
x))
|
||||
: (Option (× Int Int))
|
||||
-> (None {Int}))
|
||||
|
||||
(check-type
|
||||
(find-min/max (Cons 1 (Cons 2 (Cons 3 Nil)))
|
||||
(λ ([x : Int] [y : Int])
|
||||
(< x y))
|
||||
(λ ([x : Int])
|
||||
x))
|
||||
: (Option (× Int Int))
|
||||
-> (Some (tup 1 3)))
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user