在递归函数中使用List调用FizzBu​​zz

时间:2011-11-06 03:26:31

标签: f# f#-interactive fizzbuzz

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窗口和更少键盘的博客/参考,因为我发现自己再次为任何语法错误输入完整代码

3 个答案:

答案 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

More options...