すでに投稿されている回答はpなぜあなたの投稿されたコードがうまくいかないのか、私はループと可変変数を使用することはあまりできないと主張します。機能。だから私はそれを解決するためのF# - 慣用的な方法を投稿すると思った。
「あなたは.NETを使用できません」と述べています。私は、組み込み関数や.NETライブラリを使用できないということを推測しています。もちろん、それはまた、がF#プリミティブを使用して自分で実装できることを意味します。
機能的な世界で共通する機能の1つは、fold
です。この機能は、シーケンスのすべての要素に関数を適用し、その関数をアキュムレータに戻すだけです。内蔵されたバージョンはSeq.fold
ですが、我々はそれを使用することができないので、私たちは1に自分自身を定義します:
let rec fold accFn arr acc =
match arr with
| [||] -> acc
| _ -> fold accFn arr.[1..] (accFn arr.[0] acc)
を。これは、各要素にaccFn
機能を適用する再帰関数で、その後に自身を呼び出します配列の残りの部分。空の配列を渡すと、再帰が終了します。
我々はのはfold
に渡すためにいくつかの簡単な関数を定義してみましょう、ということがあります。
let min x y =
if x < y then x
else y
let max x y =
if x > y then x
else y
let sum x y =
x + y
我々が述べた問題に対する解決策は単純である、ことをしたら:
let arrX= [|9; 11; 3; 4; 5; 6; 7; 8|]
let head = arrX.[0]
let avg = (fold sum arrX 0)/arrX.Length
let minValue = fold min arrX head
let maxValue = fold max arrX head
使用Array.max、Array.min、Array.averageBy float – BLUEPIXY