I'm trying to do the Tower of Hanoi but I don't know how to add a count incrementer. Here's my code:
open System
let disks = Int32.Parse(Console.ReadLine())
let rec hanoi num start finish =
match num with
| 0 -> [ ]
| _ -> let temp = (6 - start - finish)
(hanoi (num-1) start temp) @ [ start, finish ] @ (hanoi (num-1) temp finish)
[<EntryPoint>]
let main args =
(hanoi disks 1 2) |> List.iter (fun pair -> match pair with
| a, b -> printf ": %A %A\n" a b)
0
I'm trying to get it to print out something like this
1: 1 3
2: 1 2
3: 3 2
etc...
I'm aware that there is no formatting set for the
1:
2:
3:
part. I know that the proper formatting is
"%A: %A %A\n" *with some counter here* a b
however I don't know how to do this. I've looked for an answer on the web but I have not found anything. If anyone could please help me, that would be greatly appreciated.
Thank you in advance
s952163's comment is the correct answer here, but here's a bit more explanation to go with it.
List.iteri
looks very similar to List.iter
, except your function will then have two arguments - the counter and the list element. Here, that would look like
hanoi disks 1 2 |> List.iteri (fun i (a, b) -> printfn "%d: %d %d" i a b)
note: I've also included a couple of ways to simplify that line of code, by
hanoi
function - the pipe operator |>
has very low precedence, so brackets are not usually required to separate its argumentsprintfn
instead of printf "...\n"
- the former is preferred because it will use the correct form of the line ending. On Windows, this is actually "\r\n" (though when you're writing to the console, it doesn't matter)(a, b)
is a type itself. You can get the arguments directly in the function call, and save yourself some typing.