F# 在递归函数调用FizzBuzz中使用List
F# 在递归函数调用FizzBuzz中使用List,f#,f#-interactive,fizzbuzz,F#,F# Interactive,Fizzbuzz,作为学习练习,在F#中使用FizzBuzz代码。 代码引用工作正常,看起来不错 在上面的代码中,我想学习/使用匹配,而不是下面的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" "
作为学习练习,在F#中使用FizzBuzz代码。
代码引用工作正常,看起来不错
在上面的代码中,我想学习/使用匹配,而不是下面的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::t
并将t
传递给fizzbuzz
。我想我正在努力学习语法
请给出如何在上述代码中使用列表(模式匹配和累加器参数)的指导
当我发现自己再次输入完整的语法错误代码时,有没有关于如何使用F#交互式窗口和更少的密钥键的博客/参考资料
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
用法:
[0..100] |> fizzbuzz
比Daniel的解决方案优雅一点,但概念相同
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#交互式:
通常,我使用脚本文件并使用Alt+'来执行代码。通过这种方式,我可以获得语法突出显示、设计时错误和智能感知
当我没有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"
比Daniel的解决方案更优雅,但概念相同
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#交互式:
通常,我使用脚本文件并使用Alt+'来执行代码。通过这种方式,我可以获得语法突出显示、设计时错误和智能感知
当我没有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"
对我来说,fizzbuzz任务的重点是使解决方案尽可能简单,以优雅地完成工作。简单的代码通常更易于阅读和维护。您的函数很好地使用了match
来解决核心部分,您只需要添加迭代来调用1到100之间的数字。这可以使用for
循环来完成:
for i in 1 .. 100 do
fizzbuzz i
这项任务是必不可少的,因为它需要您打印到控制台,因此需要将其调整到更具功能的版本(即,将结果收集为字符串,而不是打印)。这是一个很好的尝试,因为接下来您需要递归列表处理或类似于list.map
(尝试使用这两种方法来解决问题是一个很好的学习方法)。对我来说,fizzbuzz任务的重点是使解决方案尽可能简单,以优雅地完成工作。简单的代码通常更易于阅读和维护。您的函数很好地使用了match
来解决核心部分,您只需要添加迭代来调用1到100之间的数字。这可以使用for
循环来完成:
for i in 1 .. 100 do
fizzbuzz i
这项任务是必不可少的,因为它需要您打印到控制台,因此需要将其调整到更具功能的版本(即,将结果收集为字符串,而不是打印)。这是一个很好的尝试,因为接下来您将需要递归列表处理或类似于
list.map
(尝试使用这两种方法解决问题是一个很好的学习方法)。@BLUEPIXY这是我的建议,请阅读我下面的答案。@Ramon Snir Yes,我的意思是说不需要任何更改。哪种语法更可读-1]List.iter fizzbuzz[1..10];;或2][1..10]>List.iter fizzbuzz@BLUEPIXY这就是我的建议,请阅读下面我的答案。@Ramon Snir是的,我的意思是说不需要更改。哪个语法更可读-1]List.iter fizzbuzz[1..10];;或2][1..10]>List.iter fizzbuzz;;在f#中有很多方法可以解决一个简单的任务。你如何决定哪种方式更好?在函数式语言世界里有什么建议吗?在f#中有很多方法可以解决一个简单的任务。你如何决定哪种方式更好?在函数式语言世界里有什么建议的指导方针吗?