Максимальное число в списке ocaml - PullRequest
0 голосов
/ 21 июня 2020

Я хочу найти максимальный элемент в списке int. Идея состоит в том, чтобы вызвать find_max только один раз и позволить support выполнить грязную работу. Функция support возвращает int, первое значение равно 0, затем, когда обнаруживается новый max, его значение сохраняется, добавляется к результату, предыдущий максимум изменяется, и его значение вычитается из результата.

Это потому, что:

old_max = x
result = 0 + old_max

Обнаружен новый максимум:

new_max= y
result = result - oldmax + new_max

Поэтому я сохраню значение new_max:

0 + old_max - old_max + new_max = new_max`.

Очевидно, что приведенный выше код является пояснительным, это мой настоящий код:

let find_max random  = 
  let rec support rlist max =
    if rlist==[] then 0
    else 
      if (List.hd rlist) > max 
      then -max + (List.hd rlist) + support (List.tl rlist) (List.hd rlist)
      else support (List.tl rlist) max ;;
  let return = support random 0 0 ;
  !return;;

let a = [1;2;3];
print_string "max element in list is : "
print_int (find_max a);
print_string "\n"

Ошибка в строке 9 !return;;, синтаксическая ошибка (очевидно: /) в ;;

1 Ответ

1 голос
/ 21 июня 2020

В OCaml нет конструкции let ... = ...;, используется локальное определение let .. = ... in ... . Вы, вероятно, захотите вообще не использовать ;; как новичок.

Кроме того, структурное равенство - =, а не ==. Точно так же вы не должны никогда использовать List.hd и List.tl в своем коде как новичок. Сопоставление с образцом всегда является лучшим вариантом. Как правило, все варианты использования этих функций могут быть заменены простым:

match rlist with
| [] -> 0
| hd :: tl -> ...

, что короче, яснее и исключает любую возможность неправильной обработки пустого списка. Ваш лог c также излишне сложен, вместо того, чтобы вычислять max - initial_value с

-max + hd + support tl hd

, вы можете вычислить максимум напрямую с помощью

hd

Затем вы звоните в службу поддержки support с слишком много аргументов. Мы можем захотеть использовать let () = ... при вычислении эффекта, а не ;;.

...