#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]]