一位朋友在他的代码库中发现了一个二次贝塞尔曲线函数,该函数使用开关表的巨大老鼠巢来执行计算。他要求我找到一个简短的表达式,让他能够替换巨大的代码块。
为了满足两种不同的好奇心,我想我会尝试在 OCaml 中实现该功能。我是一个非常新手的 OCaml 程序员,我也不熟悉这个函数,而且这个具体的实现很难通过谷歌得到。
非常感谢对函数的性能/正确性及其实现的批评。
二次贝塞尔曲线的实现:
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.);;