ある友人が、コードベースで、スイッチ テーブルの巨大なラット ネストを使用して計算を実行する 2 次ベジエ曲線関数に出くわしました。彼は私に、巨大なコード ブロックを置き換えることができる短い式を 1 つ見つけるように要求しました。
2 つの異なる好奇心を満たすために、この関数を OCaml で実装してみようと思いました。私は非常に初心者の OCaml プログラマーであり、関数にも慣れていないため、この特定の実装を Google 経由で入手するのは困難です。
関数のパフォーマンス/正確性とその実装の両方に対する批評は非常に高く評価されます。
二次ベジエ曲線の実装:
let rec b2 n =
let p1 = -10. in
let p2 = 10. in
let q = n*.n in
let rec b2i n i hd =
if i > n then
List.rev hd
else
let t = i /. n in
b2i n (i+.1.) ((((1.-.t)**2.)*.p1+.(2.*.t*.(1.-.t)*.q)+.(t**2.)*.p2) :: hd)
in b2i n 0. []
;;
let floatprint lst = List.iter (fun f -> Printf.printf "%f; " f) lst ;;
floatprint (b2 8.);;