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