Функция, которая возвращает наибольшее среднее значение из нескольких списков чисел

#list #haskell #recursion #average

Вопрос:

Я должен определить highestAverage :: [[Int]] -gt; Double функцию, которая возвращает наибольшее среднее значение из списка списков, содержащих числа.

Например:

bestAverage [[3,1], [5,4,3], [], [5,5,5], [1,2,3]] == 5.0

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

 listAverage :: [Int] -gt; Double listAverage [] = 0.0 listAverage x = fromIntegral(sum x)/fromIntegral(length x)  

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

 highestAverage :: [[Int]] -gt; Double highestAverage [[]] = 0.0 highestAverage (x:xs) = max(listAverage x, listAverage xs)  

Комментарии:

1. Какие ошибки вы получаете?

2. Являются listAverage и groupAvg должны быть одинаковыми?

Ответ №1:

Для непустого списка вы вызываете groupAvg в первом подсписке x , а затем определяете разницу max между этим значением и рекурсивным вызовом в конце списка. Базовым случаем является один подсписк, в котором мы вычисляем максимальное значение:

 highestAverage :: [[Int]] -gt; Double highestAverage [x] = listAverage x highestAverage (x:xs) = max (listAverage x) (highestAverage xs) 

Эта функция не будет работать для пустого списка. Если вы хотите вернуться 0 к пустому списку, вы можете изменить базовый регистр на:

 highestAverage :: [[Int]] -gt; Double highestAverage [] = 0 highestAverage (x:xs) = max (listAverage x) (highestAverage xs) 

Комментарии:

1. вторая версия не будет работать, если в некоторых списках подсписков могут быть отрицательные средние значения — если ВСЕ они будут, это неправильно даст 0 для самого высокого среднего значения.

2. @RobinZigmond: да, я тоже не фанат этого, обычно максимум в пустом списке ничего не должен возвращать, так как это не имеет смысла. Но среднее значение пустого списка также не должно возвращаться 0 .

3. Если вы собираетесь жестко закодировать результат для пустого списка, лучше, чтобы он был -1/0 в плавающем или minBound целочисленном виде. Но я согласен, что лучше оставить максимум пустого списка неопределенным или Nothing .

Ответ №2:

Вы можете просто отобразить свою функцию по списку и взять максимум:

максимальный размер списка карт в $ [[3,1], [5,4,3], [], [5,5,5], [1,2,3]]