Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 在递归函数调用FizzBuzz中使用List_F#_F# Interactive_Fizzbuzz - Fatal编程技术网

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#中有很多方法可以解决一个简单的任务。你如何决定哪种方式更好?在函数式语言世界里有什么建议的指导方针吗?