Итак, ответ ясен из других постов. Я просто собираюсь использовать это пространство, чтобы сделать это на функциональном языке (Haskell), где такого рода ошибки не происходят.
Просто получить максимальный балл легко, если принять во внимание списки (стоимость, калорийность) кортежей:
let bang (cost, cal) = cal / cost
in maximum [bang c1 + bang c2 + bang c3 + bang c4 |
c1 <- appetizers,
c2 <- salads,
c3 <- entrees,
c4 <- deserts]
Если вы представляете свои данные в виде кортежей (имя, (стоимость, калория)), то это более раздражает. Лучший способ - определить максимальную функцию, которая использует параметр «ключ», как в Python (возможно, он уже есть, но я не знаю об этом). Тогда вы просто сделаете это:
maximumkey snd [([n1, n2, n3, n4], bang c1 + bang c2 + bang c3 + bang c4) |
(n1, c1) <- appetizers,
(n2, c2) <- salads,
(n3, c3) <- entrees
(n4, c4) <- deserts]
Для завершения решения. Вот как (примерно) определяется maximum
:
maximum xs = foldl1 max xs
То есть maximumkey
это:
maximumkey f xs = foldl1 (\(a,b) -> if (f a) > (f b) then a else b) xs
Примечание: это немного неэффективно, так как для каждого элемента вызывается 'f' более одного раза.