Как определить количество шагов, выполненных в моей взаимной рекурсивной программе? - PullRequest
0 голосов
/ 21 сентября 2019

Я новичок в OCaml.У меня есть небольшое упражнение для обучения, чтобы познакомиться с понятием взаимной рекурсии в OCaml.Идея функции, которую мне нужно написать, состоит в том, чтобы иметь возможность подсчитать шаги функции. В основном: есть склад с двумя сотрудниками, которым необходимо доставить эти коробки.Сотрудник А может вынимать по одной коробке за раз, Сотрудник Б может вынимать по 2 коробки за раз, если количество оставшихся ящиков четное.Извлечение одного блока (или двух) - это один шаг.

Я пытался использовать переменную, которую я пытаюсь увеличивать при каждом вызове одной из функций.

Вот код, который ядо сих пор.

let rec employeeA n =
  let x = 0 in
  if n > 0 && n mod 2 = 0 then
    x + 1 + employeeB(n-2)
  else
    0
and employeeB n = 
  let x = 0 in
  if n > 0 && n mod 2 != 0 then
    x + 1 + employeeA(n-1)
  else
    0;;

До сих пор он возвращал 0 или 1 для функции employeeA или 0 или 2 для функции employeeB.Хотя ожидаемый результат будет, например, для 11 блоков, если EmployeeA запускается, он должен вернуть 10 шагов, а если EmployeeB - 11 шагов.

Спасибо.

1 Ответ

1 голос
/ 21 сентября 2019

Если вы посмотрите на эту часть кода:

if n > 0 && n mod 2 = 0 then
    x + 1 + employeeB(n-2)
else
    0

Вы говорите, что если число блоков не является четным, то для их обработки требуется 0 шагов.Это не может быть правдой.Я бы сказал, что вам нужно вызвать employeeB, если n> 0 и оно не является четным.

Вообще говоря, вам нужно помнить, что переменные в OCaml являются неизменяемыми.На самом деле вам не нужно говорить:

let x = 0 in
... x + 1 + employeeB (n - 2)

Поскольку x является неизменным, оно всегда будет равно 0. Так что это то же самое, что просто сказать:

1 + employeeB (n - 2)
...