1

As a learning Exercise with the FizzBuzz code in F#.

此处的代码参考工作正常,看起来不错

在上面的代码中,我想学习/使用match而不是 if 条件如下,所以写了下面的函数,它适用于任何给定的 int 值。

let fizzbuzz num =
   match num with
   | x when (x % 3 = 0 && x % 5 = 0) -> printfn "%s" "FizzBuzz"
   | x when (x % 3 = 0) -> printfn "%s" "Fizz"
   | x when (x % 5 = 0) -> printfn "%s" "Buzz"
   | _ -> printfn "%s" (num.ToString())
;;

输出:

fizzbuzz 15;;
FizzBuzz
val it : unit = ()

但是,在我上面的代码中,需要使用列表作为输入并将函数设为递归。我该怎么做?我理解列表的工作,即使用h::tt作为递归传递给fizzbuzz. 我猜我在语法上苦苦挣扎。

向您提供有关如何在上述代码中使用列表(模式匹配和累加器参数)的指导?

是否有任何关于如何使用 F# Interactive 窗口和更少按键的博客/参考,因为我发现自己再次为任何语法错误输入完整代码

4

3 回答 3

4

比丹尼尔更优雅的解决方案,但概念相同。

let fizzbuzz =
    List.iter (function
        | x when x % 3 = 0 && x % 5 = 0 -> printfn "FizzBuzz"
        | x when x % 3 = 0 -> printfn "Fizz"
        | x when x % 5 = 0 -> printfn "Buzz"
        | x -> printfn "%d" x)

用法与丹尼尔的解决方案相同:

[0..100] |> fizzbuzz

编辑:关于 F# Interactive:

通常,我使用脚本文件并使用 Alt+' 来执行代码。通过这种方式,我可以获得语法高亮、设计时错误和 IntelliSense。

当我没有 Visual Studio(而且我不喜欢 MonoDevelop 或其他任何名称)时,我使用具有自动完成功能的命令行 F# Interactive(按TAB,它将自动完成,TAB如果需要,请再次按不同的完成)。

再次编辑:这是一个带有递归和累加器的解决方案:

let fizzbuzz =
    let rec util acc = function
        | [] -> acc
        | h::t ->
            let h =
                match h with
                | x when x % 3 = 0 && x % 5 = 0 -> "FizzBuzz"
                | x when x % 3 = 0 -> "Fizz"
                | x when x % 5 = 0 -> "Buzz"
                | x -> string x
            util (acc + "\r\n" + h) t
    util "" >> fun x -> x.[ 2 .. ]

例子:

> fizzbuzz [1..15];;
val it : string =
  "1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz"
于 2011-11-06T05:55:58.910 回答
2

对我来说,fizzbuzz任务的重点是使解决方案尽可能简单,以便优雅地完成工作。简单的代码通常更具可读性和易于维护。您的函数match很好地解决了核心部分,您只需要添加迭代来调用从 1 到 100 的数字。这可以使用for循环来完成:

for i in 1 .. 100 do
  fizzbuzz i

该任务势在必行,因为它需要您打印到控制台,因此将其调整为功能更强大的版本(即以字符串的形式收集结果,而不是打印)。这是接下来尝试的一件好事,因为那样你要么需要递归列表处理或类似的函数List.map(尝试使用两种方式解决问题是一种很好的学习方式)。

于 2011-11-06T12:08:33.433 回答
1
let rec fizzbuzz = function
  | [] -> ()
  | h :: t ->
    match h with
    | x when (x % 3 = 0 && x % 5 = 0) -> printfn "FizzBuzz"
    | x when (x % 3 = 0) -> printfn "Fizz"
    | x when (x % 5 = 0) -> printfn "Buzz"
    | x -> printfn "%d" x)
    fizzbuzz t

用法:

[0..100] |> fizzbuzz

更多的选择...

于 2011-11-06T04:48:51.597 回答