Today I found an question and decide to use F# pattern match to give it a try.
The question is reverse a list every k node. For example, if the input list is [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] and k = 3, the output will be [3; 2; 1; 6; 5; 4; 9; 8; 7; 10].
When I use pattern matching, I always like recursive implementation.
Tweet to fsharp
The question is reverse a list every k node. For example, if the input list is [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] and k = 3, the output will be [3; 2; 1; 6; 5; 4; 9; 8; 7; 10].
When I use pattern matching, I always like recursive implementation.
let arr = [1..10]
let rec reverse arr i =
let reverse2 arr =
arr |> List.rev
let rec getHeadTail arr i =
match i with
| 0 -> ([], arr)
| _ ->
match arr with
| [] -> ([], [])
| h::t ->
let (head,tail) = getHeadTail t (i-1)
([h]@head, tail)
let headArr, tail = getHeadTail arr i
match tail with
| [] -> reverse2 headArr
| _ -> reverse2 headArr @ reverse tail i
reverse arr 6
Tweet to fsharp
2 comments:
Thanks for the great blog. Is there a reason you would not want to implement the list grouping reversion using Seq.take, .skip and .toList?
Thanks.
let rec splitList s i =
if List.length s < i then
[List.rev s]
else
let a = Seq.take i s |> Seq.toList
let b = Seq.skip i s |> Seq.toList
[List.rev a] @ (splitList b i)
splitList l 3
Thanks for the great blog. Is there a reason you would not want to implement the list grouping reversion using Seq.take, .skip and .toList?
Thanks.
let rec splitList s i =
if List.length s < i then
[List.rev s]
else
let a = Seq.take i s |> Seq.toList
let b = Seq.skip i s |> Seq.toList
[List.rev a] @ (splitList b i)
splitList l 3
val splitList : s:'a list -> i:int -> 'a list list
val it : int list list = [[3; 2; 1]; [6; 5; 4]; [9; 8; 7]; [11; 10]]
Post a Comment