在OCaml上浮动的因子

时间:2015-12-05 19:58:13

标签: ocaml tail-recursion factorial

我是OCaml上的新手,我试图制作一个尾递归函数来计算浮点数的阶乘。这就是我所做的:

let factorial num =
let rec aux i f =
    if i=num then f
    else aux (i+.1.) (float f*.(i+.1.))
in aux 0. 1.;;

它给了我这个错误:这个表达式有float类型,但是表达式的类型为int。

我不知道如何解决这个问题,因为我无法找到错误的位置。

1 个答案:

答案 0 :(得分:3)

# float;; - : int -> float = <fun> 是一个接受int并返回浮点数的函数。

float f

因此,您的表达式f强制aux成为一个int,这迫使aux将一个int作为最终参数,然后由于{{{1}的参数而被破坏来自(float f*.(i+.1.))的1}}是一个浮点数。

看起来你希望所有东西都是浮动的,所以你只需要将调用放到float

# let factorial num =
    let rec aux i f =
      if i=num then f
      else aux (i+.1.) (f*.(i+.1.))
   in aux 0. 1.;;
val factorial : float -> float = <fun>

# factorial 4.0;;
- : float = 24.