【问题标题】:How to add a Increment Counter in F#如何在 F# 中添加增量计数器
【发布时间】:2017-03-28 16:21:09
【问题描述】:

我正在尝试制作河内塔,但我不知道如何添加计数增量器。这是我的代码:

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

但是我不知道该怎么做。我已经在网上寻找答案,但我没有找到任何东西。如果有人可以帮助我,将不胜感激。

提前谢谢你

【问题讨论】:

  • List.iteri 会给你柜台。
  • 这与您的问题无关,但您可能想在学习语言时查看使用.fsx 文件和F# interactive - 您根本不必编译代码,您可以在同一窗口中调整并查看反馈。您可以通过突出显示并按alt-enter 将 Visual Studio 中的代码发送到 F# 交互。

标签: f# counter increment towers-of-hanoi


【解决方案1】:

s952163 的comment 是这里的正确答案,但这里有更多解释。

List.iteri 看起来与List.iter 非常相似,只是你的函数将有两个参数——计数器和列表元素。在这里,看起来像

hanoi disks 1 2 |> List.iteri (fun i (a, b) -> printfn "%d: %d %d" i a b)

注意:我还提供了一些方法来简化该行代码,通过

  • 删除 hanoi 函数周围不必要的括号 - 管道运算符 |&gt; 的优先级很低,因此通常不需要括号来分隔其参数
  • 使用printfn 而不是printf "...\n" - 首选前者,因为它将使用正确的行尾形式。在 Windows 上,这实际上是“\r\n”(尽管当您写入控制台时,这并不重要)
  • 从 lambda 函数中删除模式匹配 - 你实际上并不是模式匹配,因为元组 (a, b) 本身就是一个类型。您可以直接在函数调用中获取参数,省去一些输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2021-09-12
    • 2011-02-24
    相关资源
    最近更新 更多