Возведение в степень русского крестьянства с использованием хвостовой рекурсии OCaml - PullRequest
0 голосов
/ 11 января 2019

Я попробовал рекурсивную версию русского крестьянства без хвоста, и она вернулась так:

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_expNTR(square 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)

Но он не вычислил правильный результат. Пожалуйста, помогите

1 Ответ

0 голосов
/ 11 января 2019

Подсказка: ваша функция square имеет тип float -> float, а * - целочисленное умножение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...