Список рекурсии в Окамле - PullRequest
       5

Список рекурсии в Окамле

0 голосов
/ 11 сентября 2018

Это то, что я хочу достичь, чтобы вернуться к списку со значениями, которые ниже заданного значения с рекурсия :

# list_below 3 [7; 1; 0; 3];;
   - : int list = [1; 0]
# list_below 1 [-7; 1; 0; 3];;
   - : int list = [-7; 0]
# list_below 9.0 [4.2; 3.6; 5.0; 12.8];;
   - : float list = [4.2; 3.6; 5.0]

Вот то, что я написал до сих пор,и это, кажется, ничего не возвращает.

let rec list_below thresh lst = 
 if List.hd lst > thresh then [] else
  List.hd lst :: list_below thresh (List.tl lst);;
;;

Не могли бы вы показать мне, что не так с моим кодом?

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Проблема должна заключаться в том, что Джеффри указал вам.

В ваших вопросах сказано, что вы хотите реализовать list_below, но ваш код показывает list_above. Я буду придерживаться list_below здесь.

Рекурсивные функции в Ocaml можно сделать довольно интуитивно, если вы используете сопоставление с образцом . Например, приведенный ниже код должен работать:

let rec list_below thresh lst =
  match lst with
  | [] -> []
  | hd :: tl -> if hd < thresh then hd :: (list_below thresh tl)
            else list_below thresh tl;;
0 голосов
/ 11 сентября 2018

Вы можете попробовать использовать List.filter. Поскольку вы хотите получить список значений, которые меньше указанного значения, тогда фильтр должен делать то, что вы хотите.

Вот документация для фильтра:

val filter : ('a -> bool) -> 'a list -> 'a list

filter p l returns all the elements of the list l that satisfy the predicate p. The order of the elements in the input list is preserved.

Вам нужно предоставить предикат p. Предикат - это функция, которая принимает элемент и возвращает логическое значение. Фильтр будет принимать этот предикат и применять к каждому значению в списке. Если предикат возвращает true для этого элемента, элемент будет добавлен в итоговый список.

Так что в вашем случае list_below должно быть

let list_below thresh lst =
    List.filter (fun elem -> elem < thresh) lst

Больше операций по списку, посмотрите эту главу в реальном мире OCaml.

0 голосов
/ 11 сентября 2018

Если первое значение выше порогового значения, ваш код всегда возвращает пустой список.Это не может быть правдой.Во-первых, это не соответствует вашему первому примеру.

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