As a learning Exercise with the FizzBuzz code in F#.
代码here的引用工作正常,看起来不错
在上面的代码中,我想学习/使用匹配,而不是如果下面的条件已写下面的函数,它适用于任何给定的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 = ()
但是在上面的代码中我需要使用list作为输入并使函数成为递归函数。我该怎么做?我理解列表的工作,即使用h::t
并将t
作为reurisves传递给fizzbuzz
。我猜我正在努力学习语法。
关于如何在上面的代码中使用list(模式匹配和累加器参数),请提供指导?
是否有任何关于如何使用F#Interactive窗口和更少键盘的博客/参考,因为我发现自己再次为任何语法错误输入完整代码
答案 0 :(得分:3)
比丹尼尔更优雅的解决方案,但同样的概念。
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)
使用方法与Daniel的解决方案相同:
[0..100] |> fizzbuzz
编辑:关于F#Interactive:
通常,我使用脚本文件并使用Alt +'来执行代码。这样我就可以获得语法高亮,设计时错误和智能感知。
当我没有Visual Studio(我不喜欢MonoDevelop或其他任何名称)时,我使用命令行F#Interactive自动完成(按TAB
,它将自动-complete,如果你想完成不同的话,再次按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"
答案 1 :(得分:2)
对我而言, fizzbuzz 任务的目的是让解决方案尽可能简单,以便优雅地完成工作。简单的代码通常更易读,易于维护。您的函数很好地使用match
来解决核心部分,您只需要添加迭代来调用1到100之间的数字。这可以使用for
循环来完成:
for i in 1 .. 100 do
fizzbuzz i
任务势在必行,因为它需要您打印到控制台,因此将其调整为更实用的版本(即将结果收集为字符串,而不是打印)。接下来尝试这是一件好事,因为那时你需要递归列表处理或像List.map
这样的函数(试图用两种方法解决问题是一种很好的学习方法)。
答案 2 :(得分: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