如何在 F# 中添加增量计数器
How to add a Increment Counter in F#
我正在尝试制作河内塔,但我不知道如何添加计数增量器。这是我的代码:
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
我想让它打印出这样的东西
1: 1 3
2: 1 2
3: 3 2
etc...
我知道没有为
设置格式
1:
2:
3:
部分。我知道正确的格式是
"%A: %A %A\n" *with some counter here* a b
但是我不知道该怎么做。我在网上寻找答案,但我什么也没找到。如果有人能帮助我,那将不胜感激。
提前致谢
s952163 的 是这里的正确答案,但这里有更多的解释。
List.iteri
看起来与 List.iter
非常相似,除了您的函数将有两个参数 - 计数器和列表元素。在这里,看起来像
hanoi disks 1 2 |> List.iteri (fun i (a, b) -> printfn "%d: %d %d" i a b)
注意:我还提供了一些方法来简化该行代码,
- 删除
hanoi
函数周围不必要的括号 - 管道运算符 |>
的优先级非常低,因此通常不需要括号来分隔其参数
- 使用
printfn
而不是 printf "...\n"
- 前者是首选,因为它将使用正确的行尾形式。在 Windows 上,这实际上是“\r\n”(尽管当您写入控制台时,这无关紧要)
- 从 lambda 函数中删除模式匹配 - 您实际上并不是模式匹配,因为元组
(a, b)
本身就是一种类型。您可以直接在函数调用中获取参数,并节省一些输入时间。
我正在尝试制作河内塔,但我不知道如何添加计数增量器。这是我的代码:
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
我想让它打印出这样的东西
1: 1 3
2: 1 2
3: 3 2
etc...
我知道没有为
设置格式1:
2:
3:
部分。我知道正确的格式是
"%A: %A %A\n" *with some counter here* a b
但是我不知道该怎么做。我在网上寻找答案,但我什么也没找到。如果有人能帮助我,那将不胜感激。
提前致谢
s952163 的
List.iteri
看起来与 List.iter
非常相似,除了您的函数将有两个参数 - 计数器和列表元素。在这里,看起来像
hanoi disks 1 2 |> List.iteri (fun i (a, b) -> printfn "%d: %d %d" i a b)
注意:我还提供了一些方法来简化该行代码,
- 删除
hanoi
函数周围不必要的括号 - 管道运算符|>
的优先级非常低,因此通常不需要括号来分隔其参数 - 使用
printfn
而不是printf "...\n"
- 前者是首选,因为它将使用正确的行尾形式。在 Windows 上,这实际上是“\r\n”(尽管当您写入控制台时,这无关紧要) - 从 lambda 函数中删除模式匹配 - 您实际上并不是模式匹配,因为元组
(a, b)
本身就是一种类型。您可以直接在函数调用中获取参数,并节省一些输入时间。