F #: написание функции для maxCubeVolume? - PullRequest
1 голос
/ 18 марта 2020

Я работаю над домашним заданием, и мне нужно написать функцию на F #, которая берет список кортежей с плавающей запятой, который представляет размеры куба (длина, ширина и высота) и возвращает объем куба, который имеет самый большой объем.

Каждый кортеж состоит из трех значений с плавающей запятой, которые все больше нуля. Объем куба вычисляется с использованием (длина х ширина х высота). Если список пуст, вернуть 0.0.

Я действительно не знаю, как реализовать это в F #, когда нам не разрешено использовать неизменяемые переменные, либо List.map или max.

На данный момент я сделал следующее:

let listTup = [(2.1, 3.4, 1.8); (4.7, 2.8, 3.2); (0.9, 6.1, 1.0);]
let cubeVolume (x, y, z) : float = x * y * z
let maxCubeVolume tupleList = ???

maxCubeVolume listTup должен вернуть 42,112

Как мне это сделать в F #?

1 Ответ

0 голосов
/ 20 марта 2020
//using the "not allowed" List.map and List.max
[(2.1, 3.4, 1.8); (4.7, 2.8, 3.2); (0.9, 6.1, 1.0)]
|> List.map (fun (l,w,h) -> l*w*h) |> List.max

//using List.fold: the if branch could be a max vol acc, but you said max wasn't allowed
(0.,[(2.1, 3.4, 1.8); (4.7, 2.8, 3.2); (0.9, 6.1, 1.0)])
||> List.fold (fun acc (l,w,h) -> l*w*h |> fun vol -> if vol > acc then vol else acc)

//using List.maxBy
let vol (l,w,h) = l*w*h
[(2.1, 3.4, 1.8); (4.7, 2.8, 3.2); (0.9, 6.1, 1.0)]
|> List.maxBy vol |> vol

//using List.sortBy
let vol (l,w,h) = l*w*h
[(2.1, 3.4, 1.8); (4.7, 2.8, 3.2); (0.9, 6.1, 1.0)]
|> List.sortBy (vol >> (*)-1.) |> List.head |> vol
...