这是OCaml中二次Bézier函数的合理实现吗?

这是OCaml中二次Bézier函数的合理实现吗?,ocaml,bezier,Ocaml,Bezier,一位朋友在他的代码库中发现了一个二次Bézier曲线函数,该函数使用开关表的巨大老鼠巢来执行计算。他向我提出挑战,要我找到一个简单、简短的表达式,让他能够替换这一大块代码 为了满足两种不同的好奇心,我想我应该尝试在OCaml中实现这个函数。我是一个非常新手的OCaml程序员,我也不熟悉这个函数,这个具体的实现很难通过谷歌获得 非常感谢对函数性能/正确性及其实现的评论 执行: 我有两个建议: 您应该在b2i返回后调用List.rev,以便ocaml可以利用其尾部递归优化。我不确定ocaml将如何处

一位朋友在他的代码库中发现了一个二次Bézier曲线函数,该函数使用开关表的巨大老鼠巢来执行计算。他向我提出挑战,要我找到一个简单、简短的表达式,让他能够替换这一大块代码

为了满足两种不同的好奇心,我想我应该尝试在OCaml中实现这个函数。我是一个非常新手的OCaml程序员,我也不熟悉这个函数,这个具体的实现很难通过谷歌获得

非常感谢对函数性能/正确性及其实现的评论

执行:


我有两个建议:

您应该在b2i返回后调用List.rev,以便ocaml可以利用其尾部递归优化。我不确定ocaml将如何处理当前的实现,但是List.rev是尾部递归的。你会注意到它是这样做的

此外,还可以将迭代的分辨率设置为可选参数,如?epsilon=0.1


作为一名ocaml程序员,除了这一点,我看不出有什么错——只要P1和P2实际上是常量。向下编译,看看将List.rev移到尾部递归内部或外部在汇编中有什么不同。

我有两个建议:

您应该在b2i返回后调用List.rev,以便ocaml可以利用其尾部递归优化。我不确定ocaml将如何处理当前的实现,但是List.rev是尾部递归的。你会注意到它是这样做的

此外,还可以将迭代的分辨率设置为可选参数,如?epsilon=0.1


作为一名ocaml程序员,除了这一点,我看不出有什么错——只要P1和P2实际上是常量。向下编译它,看看在尾部递归内部或外部移动List.rev与汇编有什么区别。

b2不是递归的,所以不需要[let rec b2 n=]。因为n永远不会改变,所以不需要将其作为b2i的参数,只需使用封闭范围中的n即可。你的内部函数应该取决于p0,p1和p2,但我认为它取决于-10,n**2和10。该函数还具有从[0.0;1.0;2.0;…;n.0]到最终值的映射形式。你能写一下吗

let b i = 
  let t = i /. n in
  let tminus = (1.-.t) in
  (tminus *. tminus *. p0) +. (2. *. t *. tminus *. p1) +. (t *. t * p2)
in
List.map b ([generate list 1.0; 2.0; ... n.0])
生成列表1.0…n.0的函数可以是:对于小n

let rec count m n = if m > n then [] else m :: (count (m+.1.) n)

b2不是递归的,因此不需要[let rec b2 n=]。因为n永远不会改变,所以不需要将其作为b2i的参数,只需使用封闭范围中的n即可。你的内部函数应该取决于p0,p1和p2,但我认为它取决于-10,n**2和10。该函数还具有从[0.0;1.0;2.0;…;n.0]到最终值的映射形式。你能写一下吗

let b i = 
  let t = i /. n in
  let tminus = (1.-.t) in
  (tminus *. tminus *. p0) +. (2. *. t *. tminus *. p1) +. (t *. t * p2)
in
List.map b ([generate list 1.0; 2.0; ... n.0])
生成列表1.0…n.0的函数可以是:对于小n

let rec count m n = if m > n then [] else m :: (count (m+.1.) n)

这可能是picayune,但hd并不是列表参数的好名称。hd是一个标准函数,返回列表的第一个元素。使用hd作为列表名称会导致混淆

这可能是picayune,但hd不是列表参数的好名字。hd是一个标准函数,返回列表的第一个元素。使用hd作为列表名称会导致混淆

list.rev代码路径不会影响b2i的尾部递归。关于epsilon的好主意。可能p1和p2也应该成为参数。list.rev代码路径不会影响b2i的尾部递归。关于epsilon的好主意。可能p1和p2也应该成为参数。这种类型的参数/列表使用什么标识符?我使用诸如xs、ys和zs之类的名称表示列表,x、y、z表示这些列表的元素。不是说这是最好的方法。因为它是一个累加器,我喜欢使用ACC。这种类型的参数/列表使用什么标识符?我使用诸如xs、ys和zs之类的名称表示列表,x、y、z表示这些列表的元素。不是说这是最好的方法。因为它是一个累加器,我喜欢用acc