Мне нужна помощь по 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 =
Так как это домашнее задание, вот намек, а не полный ответ. При использовании списков F# вы часто хотите разделить список на первый элемент и остальные, затем выполнить некоторую операцию с первым элементом и рекурсивно вызвать функцию для остальной части списка. В конце концов остальная часть списка будет пуста, и в этот момент вы больше не будете выполнять рекурсивные вызовы.
let rec содержит (x: Nat, list: Nat list): bool = список соответствий с | [] -> ложь | m :: xs, когда x =





Код, который у вас есть до сих пор, является хорошей отправной точкой. Я заменю Nat на int, которое является именем типа, которое использует F#, и заменю параметр tupled разделенным пробелом, что является более распространенной нотацией.
Первое, что вам нужно сделать в первую очередь, - это избегать использования имени 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.Идея очень проста: просмотрите список и проверьте, равен ли его первый элемент тому, который вы ищете. Если это так, верните true, в противном случае перейдите к поиску оставшейся части списка. Если список (исходный или оставшийся) пуст, значит, ни один элемент не удовлетворяет условию, поэтому результат будет ложным.
Это можно очень компактно смоделировать как небольшую рекурсивную функцию:
let rec contains n = function
| [] -> false
| x :: xs -> (n = x) || contains n xs
Кстати, эта функция будет работать не только со списками целых чисел; он будет автоматически обобщен для работы со списками любого типа, поддерживающими сравнение на равенство.
Пожалуйста, добавьте код, который у вас есть.