F # определить функцию поиска - PullRequest
0 голосов
/ 09 марта 2020

Я новичок в F # и у меня проблемы с моим кодом. Это простая задача - определить функцию search, с помощью которой взять булеву функцию и список и вернуть индекс. Например:

> search (fun x -> x > 10) [ 2; 12; 3; 23; 62; 8; 2 ];;
val it : int = 1

> search (fun s -> s < "horse") [ "pig"; "lion"; "horse"; "cow"; "turkey" ];;
val it : int = 3

То, что у меня есть на данный момент, находит правильное совпадение, но я не могу понять, как вернуть число вместо остальной части списка. Я знаю, что получаю список вместо значения обратно, потому что я написал «если голова, то список». То, что я не знаю, это то, что я должен поставить вместо этого, или если то, что у меня есть, не даст желаемого результата.

Ниже приведен код, который я написал.

let rec search f list =
    match list with
        | [] -> [-1]
        | head::tail ->
            if f head then list
            else search f tail

Ответы [ 2 ]

1 голос
/ 09 марта 2020

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

При использовании рекурсии вы меняете состояние, вызывая свою функцию рекурсивно с «измененными» аргументами. Вы уже делаете это со списком здесь. Чтобы сохранить внутреннее состояние в рекурсивной функции, вы должны ввести другой аргумент, но не выставлять его снаружи. Вы можете решить это, используя внутреннюю рекурсивную вспомогательную функцию. Вот тот, который отслеживает предыдущий элемент и возвращает его при обнаружении совпадения:

let search f list =
    let rec loop list prev =
        match list with
            | [] -> None
            | head::tail ->
                if f head then prev
                else loop tail (Some head)
    in
    loop list None

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

0 голосов
/ 09 марта 2020

Обычно вы определяете внутреннюю рекурсивную функцию, чтобы помочь вам переносить состояние при l oop, а затем вызывать внутреннюю функцию с начальным состоянием.

   let search predicate list =
    let rec loop list index =
        match list with
            | [] -> -1
            | head::tail ->
                if predicate head then index
                else loop tail (index + 1)
    loop list 0
...