Сравнение элементов массивов в Erlang - PullRequest
4 голосов
/ 27 октября 2011

Я пытаюсь научиться мыслить функциональным способом программирования, для этого я пытаюсь выучить Erlang и решать простые задачи из codingbat.Я пришел с общей проблемой сравнения элементов в списке.Например, сравните значение i-го элемента позиции со значением i + 1-й позиции списка.Итак, я думал и искал, как сделать это функционально в Erlang (или любом другом функциональном языке).

Пожалуйста, будьте осторожны со мной, я очень новичок в этом функциональном мире, но я хочу научиться

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 27 октября 2011

Определить список:

L = [1,2,3,4,4,5,6]

Определить функцию f, которая принимает список

  • Если он соответствует списку из одного элемента или пустому списку, вернуть пустой список
  • Если он соответствует первому элементу и второму элементу, тогда возьмите первый элемент и создайте новый список, вызывая остальную часть списка рекурсивно
  • В противном случае пропустить первый элемент списка.

В коде Erlang

f ([]) -> [];
f ([_]) -> [];
f ([X, X|Rest]) -> [X | f(Rest)];
f ([_|Rest]) -> f(Rest).

Применить функцию

f(L)

Это должно сработать ... не скомпилировали и не запустили его, но оно должно помочь вам начать. Также на случай, если вам нужно внести в него изменения, чтобы вести себя иначе.

Добро пожаловать в Эрланг;)

1 голос
/ 27 октября 2011

Я стараюсь быть мягким ;-) Итак, главное в функциональном подходе - думать в терминах: что такое ввод? Что должно быть выведено? Нет ничего лучше, чем сравнивать i-й элемент с одним i + 1-м элементом. Это всегда должно быть целью, которая приведет к преобразованию данных. Даже пример Mazen Harake делает это. В этом примере есть функция, которая возвращает только элементы, за которыми следует то же значение, то есть фильтрует заданный список. Как правило, есть очень разные способы, как сделать похожую вещь, которая зависит от ее цели. List - это базовая функциональная структура, и вы можете делать с ней удивительные вещи, как показывает нам Lisp, но вы должны помнить, что это не массив.

Каждый раз, когда вам необходим доступ к повторяемому i-му элементу, это указывает на то, что вы используете неправильную структуру данных. Вы можете создавать различные структуры данных, формируя списки и кортежи в Erlang, которые могут лучше служить вашим целям. Поэтому, когда вы сталкиваетесь с проблемой сравнения i-го с i + 1-м элементом, вам следует остановиться и подумать. Какова цель этого? Вам нужно выполнить преобразование данных stream , как Mazen Harake , или вам нужен произвольный доступ? Если второе, вы должны использовать другую структуру данных (например, array ). Даже тогда вы должны думать о характеристиках вашей задачи. Если вы будете в основном читать и почти никогда не будете писать, вы можете использовать list_to_tuple(L), а затем читать, используя element/2. Когда вам потребуется время от времени писать, вы начнете думать о разбиении его на несколько кортежей, и по мере того, как ваш коэффициент записи будет расти, вы получите реализацию array.

Так что вы можете использовать lists:nth/2, если вы будете делать это только один или несколько раз, но в коротком списке, и вы не помешаны на производительности, как я. Вы можете улучшить его, используя [X1,X2|_] = lists:nthtail(I-1, L) (L = lists:nthtail(0,L) работает как положено). Если вы сталкиваетесь с большими списками и хотите многократно звонить, вам нужно переосмыслить свой подход.

P.S .: Есть много других интересных структур данных, кроме списков и деревьев. Молнии например.

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