F # Список содержит - PullRequest
       29

F # Список содержит

0 голосов
/ 15 ноября 2018

Мне нужна помощь в F #. Мне нужно проверить, существует ли число в списке, используя рекурсивную функцию и не используя List.contains или что-то подобное. Программа должна только сказать мне, если это правда или ложь. например:

contains(8N, [3N; 8N; 2N]) = true
contains(7N, [3N; 8N; 2N]) = false

Что у меня есть до сих пор:

let rec contains(x: Nat, list: Nat list): bool =
    match list with 
    | [] -> false
    | x::xs when x =

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Идея очень проста: просмотрите список и проверьте, равен ли его первый элемент тому, который вы ищете. Если это так, верните true, в противном случае переходите к поиску оставшейся части списка. Если (исходный или оставшийся) список пуст, ни один элемент не удовлетворяет условию, и поэтому результат равен false.

Это может быть очень компактно смоделировано как небольшая рекурсивная функция:

let rec contains n = function
    | [] -> false
    | x :: xs -> (n = x) || contains n xs

Кстати, эта функция будет работать не только со списками целых чисел; оно будет автоматически обобщено для работы со списками любого типа, поддерживающего сравнение на равенство.

0 голосов
/ 16 ноября 2018

Код, который у вас есть, является хорошей отправной точкой.Я заменим Nat на int - это имя типа, которое использует F #, и заменю параметр с кортежем на пробел, который является более распространенным обозначением.

Одна вещь, которую вам нужно сделать в первую очередьчтобы не использовать имя x дважды - прямо сейчас, у вас есть x в качестве имени нужного номера и в качестве имени для первого элемента списка.После того, как вы переименуете их, вы можете указать условие в when:

let rec contains (lookingFor:int) (list:int list) : bool =
    match list with 
    | [] -> false
    | firstInList::restOfList when firstInList = lookingFor -> (...)
    | firstInList::restOfList -> (...)

Теперь есть две вещи, которые вам нужно обработать:

  • Когда firstInList = lookingFor, выхотите вернуть true.
  • В противном случае (последний случай, который я добавил), вам нужно сделать рекурсивный вызов.Вы знаете, что firstInList - это не тот номер, который вы ищете, и вам нужно проверить, содержит ли restOfList номер - это единственный рекурсивный вызов вашей функции contains.
...