Как я могу поднять число до степени в OCaml? - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь написать функцию, которая принимает 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_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.

Что мне делать?

1 Ответ

0 голосов
/ 26 сентября 2019

Ключевая проблема, я думаю, заключается в том, что mod является ключевым словом в OCaml и рассматривается как инфиксный оператор.Но mod_float это просто обычная функция.Вы должны использовать его в виде префикса.

Так что x mod n следует перевести на mod_float x n.

У вас есть другая проблема, которая заключается в том, что вы используете специальное назначение == оператор для сравнения на равенство.Вы хотите использовать = для сравнений на равенство в OCaml, если только вам не нужно «физическое» сравнение (а здесь это не то, что вам нужно).

Это не просто стилистика - это действительно имеет значение.Обратите внимание на следующие результаты:

# 0.0 == 0.0;;
- : bool = false
# 0.0 = 0.0;;
- : bool = true
...