F # Возвращает кортеж из 3 элементов с наибольшим средним значением из списка кортежей - PullRequest
2 голосов
/ 05 мая 2019

У меня проблема с практикой домашнего задания, и я новичок в F #, а синтаксис настолько запутанный, что я не знаю, с чего начать.

Например, если у меня есть список кортежей с возрастающими значениями:

let tupleList = [(1,2,3);(10,12,15);(9,10,20)]

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

Таким образом, функция должна возвращать:

(10,12,15)

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

Спасибо!

Ответы [ 4 ]

2 голосов
/ 05 мая 2019

Если ни одна из встроенных функций не может быть использована, то вы можете использовать либо (1) изменяемые переменные и while, либо (2) рекурсию.

Поскольку вы изучаете функциональное программирование, весьма вероятно, что ваш профессор предпочтет рекурсию. Вот решение:

let max2 (a,b,c) (x,y,z) = if b > y then (a,b,c) else (x,y,z)

let maxMany tuples =
    let rec loop currentMaxTuple remainTuples =
        match remainTuples with
        | [] -> currentMaxTuple
        | tuple :: rest ->
            let newMaxTuple = max2 currentMaxTuple tuple
            loop newMaxTuple rest
    match tuples with
    | [] -> None
    | head :: rest -> Some (loop head rest)

let tupleList = [(1,2,3);(10,12,15);(9,10,20)]
maxMany tupleList |> printfn "%A"
2 голосов
/ 05 мая 2019

Немного отличается от решения @Nghia Bui, вы можете использовать сопоставление с образцом для сравнения элементов кортежей.

let maxSnd tuples = 
    let rec loop list tuple = 
        match list, tuple with
        | [], _ -> tuple
        | (x, y, z) :: xs, (a, b, c) -> 
            if y < b then (a, b, c) else (x, y, z) 
            |> loop xs
    match tuples with
    | [] -> invalidArg "tuples" "Empty list"; 0, 0, 0
    | x :: xs -> loop xs x 
2 голосов
/ 05 мая 2019

Вы, вероятно, должны прочитать книгу на F # или работать с https://fsharpforfunandprofit.com/

. Вы можете использовать List.max или List.maxBy, чтобы получить максимум в списке.Поскольку у вас есть кортеж из трех элементов, вам нужно будет его деконструировать (поскольку нет функции для доступа к n-му элементу кортежа, только к первому или второму).Как только вы выставите среднее значение, вы можете запустить на нем maxby и избавиться от ненужных частей.

let tupleList = [(1,2,3);(10,12,15);(9,10,20)]

tupleList
|> List.map (fun (a,b,c) -> (b, (a,b,c)))
|> List.maxBy fst
|> snd

val it: int * int * int = (10, 12, 15)

1 голос
/ 09 мая 2019

Немного поздно, но все равно:

let maxByMiddle data =
    let rec find lst =
        match lst with
        | [] -> Error("No entries in list")
        | [a, b, c] -> Ok(a, b, c)
        | (_, bmax, _)::(a, b, c)::tail when b > bmax -> find ((a, b, c)::tail)
        | maxima::_::tail -> find (maxima::tail)


    find data
...