2011-11-06 59 views
0

As a learning Exercise with the FizzBuzz code in F#.在递归函数调用使用列表FizzBu​​zz

参考使用代码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 =() 

但是在我使用的列表作为输入,并让功能递归需要上面的代码。我该怎么做?我了解名单的工作,即使用h::t并将t作为recurisve传递给fizzbuzz。我正在努力与我猜的语法。

在上面的代码中,如何使用列表(模式匹配和累加器参数)的高级指导?

是否有关于如何使用F#互动窗口少keystokes,因为我发现自己再次任何语法错误

+0

List.iter fizzbuzz [1..20] – BLUEPIXY

+0

@BLUEPIXY这就是我所建议的,阅读下面的答案。 –

+1

@Ramon Snir是的,我的意思是说不需要改变。 – BLUEPIXY

回答

3

比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) 

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

[0..100] |> fizzbuzz 

编辑:关于F#互动:

在一般情况下,我用一个脚本文件工作,使用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" 
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...

2

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

for i in 1 .. 100 do 
    fizzbuzz i 

的任务是必要的,因为它需要你打印到控制台上,所以它调整到一个功能更强大的版本(即收集结果作为字符串,而不是打印) 。接下来尝试这是一件好事,因为那样你将需要递归列表处理或像List.map这样的函数(试图用这两种方法解决问题是学习的好方法)。

+0

有很多方法可以解决f#中的一个简单任务。你如何决定哪种方式更好?功能语言世界中是否有建议的指导原则? – swapneel