Минимальный элемент массива - PullRequest
0 голосов
/ 20 декабря 2018

Абстрактный вопрос, не связанный с каким-либо конкретным языком:

Если у меня есть следующая функция

min(int, int) :: int

, которая возвращает наименьшее значение в массиве, и

concat([int], [int]) :: [int]

, который объединяет два массива, как мне написать такую ​​функцию, как

minInArray([int]) :: Int

, которая возвращает наименьший элемент в массиве, но где выходные данные могут быть соединены в цепочку, даже с пустым входоммассив:

min(minInArray(array1), minInArray(array2)) == minInArray(concat(array1, array2))

Другими словами, есть ли какой-либо обычно используемый нейтральный элемент, который minInArray мог бы вернуть при пустом вводе, который не испортил бы min()?

Ответы [ 4 ]

0 голосов
/ 21 декабря 2018

Просто чтобы добавить некоторые перспективы (не то, чтобы это было дубликатом перечисленных вопросов) -

Все эти ошибки броска какого-то рода, когда их просят вычислить минимум пустого списка или массива: Java, Scala, Python, NumPy, Javascript, C #.Вероятно, больше, но это, насколько я посмотрел.Я уверен, что есть такие, которые этого не делают, но я ожидаю, что большинство из них будут языками, которые обмениваются понятностью и ясностью для скорости.

Этот вопрос касается конкретногоязык, но имеет ответы, относящиеся ко всем языкам.

Обратите внимание здесь , как можно обойти проблему в чем-то вроде Python.

В частности, для Haskell обратите внимание на совет в этом вопросе.

И наконец вот ответ для более общего случая вашего вопроса.

В общем, это всегда наиболее важночтобы код работал, но ближе ко всему, он должен быть понятен людям.Возможно, это не имеет значения для вашего текущего проекта, если вы будете единственным, кто имеет дело с этой функцией, но последнее, что я ожидаю при вызове функции 'get_minimum', это Int.MAX.

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

0 голосов
/ 20 декабря 2018

Размышляя над проблемой, мы пришли к единственно возможному решению: если массив пуст - мы должны вернуть максимально возможное значение для int, чтобы удовлетворить условию.

На самом деле это не так уж и приятно...

0 голосов
/ 20 декабря 2018

minInArray (arr1) для возврата нуля, если arr1 пуст.

min () должен возвращать только ненулевые значения сверх нуля.Значение min () вернет ноль, только если оба параметра равны нулю.В противном случае он вернет минимальное ненулевое значение.

0 голосов
/ 20 декабря 2018

Одним из вариантов будет возвращение некоторого нейтрального значения, например null или NaN, если в массиве нет элементов, а затем, если запущена функция min() и один из аргументов является нейтральным значением, тогда вы простовернуть мин другого массива.Другой вариант - вернуть ближайшее значение, которое имеет язык, к +Infinity, если массив пуст;это работает и не требует изменения min(), но побочным эффектом является возврат бесконечного значения иногда при вызове функции minInArray().Это бесконечное значение может работать как действительно нейтральное значение, которое работает с функцией min() по умолчанию, но может вызвать некоторую путаницу, если минимальное значение в массиве действительно бесконечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...