1

As a learning Exercise with the FizzBuzz code in F#.

ここのコードを参照すると、正常に機能し、見栄えがよくなります

上記のコードでは、以下の if 条件の代わりにmatchを学習/使用したいので、任意の 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 = ()

ただし、上記のコードでは、リストを入力として使用し、関数を再帰的にする必要がありました。どうすればできますか?リストの動作、つまりrecurisve to を使用h::tして渡すことを理解しています。私は推測する構文に苦労しています。tfizzbuzz

上記のコードでリスト (パターン マッチングとアキュムレータ引数) を使用する方法についてのガイダンスを提供してください。

構文エラーのために完全なコードをもう一度入力していることに気付いたので、少ないキーストロークで F# Interactive ウィンドウを使用する方法に関するブログ/リファレンスはありますか?

4

3 に答える 3

4

ダニエルのソリューションよりも少しエレガントなソリューションですが、コンセプトは同じです。

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"
于 2011-11-06T05:55:58.910 に答える
2

私にとって、fizzbuzzタスクのポイントは、ソリューションをできるだけシンプルにして、仕事をエレガントに終わらせることです。一般に、単純なコードはより読みやすく、保守も容易です。関数はmatchコア部分を解決するためにうまく使用され、1 から 100 までの数値を呼び出すために反復を追加するだけで済みます。これはforループを使用して実行できます。

for i in 1 .. 100 do
  fizzbuzz i

コンソールに出力する必要があるため、このタスクは必須です。より機能的なバージョンに調整します (つまり、結果を出力する代わりに文字列として収集します)。これは次に試すのに良い方法です。なぜなら、再帰的なリスト処理または次のような関数が必要になるからですList.map(両方の方法を使用して問題を解決しようとすることは、学ぶための良い方法です)。

于 2011-11-06T12:08:33.433 に答える
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

より多くのオプション...

于 2011-11-06T04:48:51.597 に答える