Нахождение наибольшего числа положительных чисел в OCaml - PullRequest
0 голосов
/ 18 февраля 2019

Попытка задать вопрос OCaml итерации по списку и найти самый длинный ряд положительных или отрицательных целых чисел.Пока я думаю, что вы должны использовать List.fold_left и как-то +1 к аккумулятору каждый раз, когда следующий знак совпадает с текущим знаком.Тем не менее, я немного застрял на том, как сохранить это значение.Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Ах, черт возьми, я тоже всю ночь занимаюсь OCaml LOL !!!вот мой шанс ... один из способов - отсортировать список, а затем найти первый положительный или первый отрицательный в зависимости от того, как вы сортируете ... извлеките функцию сортировки из https://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html ... тогда легко получитьразмер.

Допустим, вы не хотите использовать эту встроенную библиотеку ... Этот код должен быть близок к работе (Если бы мой редактор / отладчик работал с OCaml, я бы провел дальнейшее тестирование, но я думаю, что этоблизко к хорошему)

let mostPositives(l: int list) : int list=

   let counter = ref 0 in  
   let maxSize = ref 0 in

   for i = 0 to List.length(l) -1 do

      if (List.nth l i) >= 0 then 
        counter := !counter + 1
      else 
        counter := 1;

      maxSize := (max !counter !maxSize );
  done;
0 голосов
/ 18 февраля 2019

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

Основная идея сгибов в целом и List.fold_left, в частности, должен поддерживать некоторое состояние при обходе коллекции (или списка в частности).Когда вы говорите, что хотите «сохранить» значение, естественным ответом будет то, что значение будет частью состояния, которое вы поддерживаете при обходе списка.

Шаблон для вызова List.fold_left выглядит следующим образом:

let final_state =
    List.fold_left update_function initial_state list

Функция обновления принимает текущее состояние и следующий элемент списка и возвращает значение следующего состояния.Вот так это выглядит так:

let update_function old_state list_element =
    let new_state =
        (* compute based on old state and element *)
    in
    new_state

Таким образом, явный ответ на ваш вопрос заключается в том, что ваша функция обновления (функция, которую вы «сверните» по списку) будет сохранять значение, возвращая его как частьновое состояние.

Вот некоторый код, который возвращает наибольшее неотрицательное целое число, которое он видит в списке:

let largest_int list =
    let update largest_so_far element =
        max largest_so_far element
    in
    List.fold_left update 0 list

Этот код «сохраняет» наибольшее из увиденных до сих пор int, возвращая егов качестве значения функции обновления.(Обратите внимание, что он возвращает значение 0 для пустого списка.)

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