Recursion 如何在OCaml中将浮点提升为指数?
我试着写一个函数,它取x,并将它提升到n的幂 如果x和n是整数,则此代码有效:Recursion 如何在OCaml中将浮点提升为指数?,recursion,functional-programming,ocaml,Recursion,Functional Programming,Ocaml,我试着写一个函数,它取x,并将它提升到n的幂 如果x和n是整数,则此代码有效: let rec pow x n = if n == 0 then 1 else if (n mod 2 = 0) then pow x (n/2) * pow x (n/2) else x * pow x (n/2) * pow x (n/2);; 如果我尝试将代码更改为在x为浮点时工作,它将崩溃: let rec float_pow x n = if n == 0.0 then 1.0 else if n mod
let rec pow x n =
if n == 0 then 1 else
if (n mod 2 = 0) then pow x (n/2) * pow x (n/2) else
x * pow x (n/2) * pow x (n/2);;
如果我尝试将代码更改为在x为浮点时工作,它将崩溃:
let rec float_pow x n =
if n == 0.0 then 1.0 else
if n mod_float 2.0 == 0.0 then float_pow x (n /. 2) *. float_pow x (n /. 2) else
x *. float_pow x (n /. 2) *. float_pow x (n /. 2);;
我得到这个错误:
Error: This expression has type float
This is not a function; it cannot be applied.
我该怎么办?我认为关键的问题是,
mod
是OCaml中的一个关键字,被视为中缀运算符。但是,mod_float
只是一个普通函数。您需要以前缀形式使用它
因此,xmod n
应转换为mod\u float xn
您还有一个问题,那就是您正在使用专用的==
运算符进行相等比较。您希望在OCaml中使用=
进行相等比较,除非您需要“物理”比较(这不是您想要的)
这不仅仅是风格上的——它真的很重要。注意以下结果:
# 0.0 == 0.0;;
- : bool = false
# 0.0 = 0.0;;
- : bool = true
对于那些只想在OCaml中将值提升为指数的人,相应的操作符在OCaml中被称为
**
,因此x^n
被编码为x**n
,例如2.0**3.14
。