使用尾部递归OCaml的俄罗斯农民指数法

使用尾部递归OCaml的俄罗斯农民指数法,ocaml,Ocaml,我尝试了俄罗斯农民指数的无尾递归版本,结果如下: let rec fast_expNTR (base, power) = match power with |0->1 |n-> if n mod 2=0 then fast_expNTR (square base, power/2) else base * fast_expNTR(square base , power/2) 但是在else base*fast\u expNTRsquare base,powe

我尝试了俄罗斯农民指数的无尾递归版本,结果如下:

let rec fast_expNTR (base, power) =
  match power with
  |0->1
  |n-> if n mod 2=0 then fast_expNTR (square base, power/2)
      else base * fast_expNTR(square base , power/2)
但是在else base*fast\u expNTRsquare base,power/2中,它说表达式应该是float类型,但是被赋予了int类型。我不理解这个错误

另外,下面是我对尾部递归快速求幂的尝试:

let fast_exp (base , power)=
  let rec helper (acc ,acc2,p)=
    if p=0 then acc * acc2
    else if p mod 2 =0 then helper(int_of_float (square (float_of_int acc)),acc2, p/2)
    else helper(int_of_float(square (float_of_int acc)),acc * acc2, p/2)
  in helper(base,1,power)

但它没有计算出正确的结果。请帮助

提示:您的函数平方有float->float类型,*是整数乘法。

您在这里没有时间问好问题。哪个网站提供了有关OCaml的错误信息?%是几种语言中的mod运算符,但不是OCaml。你应该找出一件你真正需要帮助的困难的事情,然后在这里问这个问题。在我看来,您的许多问题,例如mod运算符的外观,都可以通过相当快的阅读OCaml教程来回答。对不起,我删除了它。对于浮点,x^0不是1,而是1。