Порівняння елементів масиву в Erlang

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

Будь ласка, будь ласка, зі мною, я дуже новачок у цьому функціональному світі, але я хочу навчитися

Спасибі заздалегідь

4

2 Відповіді

Визначте список:

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

Визначте функцію f, яка приймає список

  • Якщо він відповідає списку одного елемента або порожнього списку, поверніть порожній список
  • Якщо він збігається з першим елементом, а другий - елемент, перший елемент і побудувати новий список, викликаючи рекурсивний решту списку
  • В іншому випадку пропустіть перший елемент списку.

У коді Ерланг

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

Застосувати функцію

f(L)

Це має працювати ... не скомпілювати і не запускати його, але він повинен почати. Також у випадку, якщо вам потрібно внести зміни до нього, він буде вести себе по-різному.

Ласкаво просимо до Ерланга;)

4
додано

Я намагаюся бути ніжним ;-) Отже, головне в функціональному підході - мислення в термінах: що таке введення? Що слід вивести? Немає нічого подібного до порівняння i-го елемента з елементом i + 1-го елемента. Завжди має бути ціль, що призведе до перетворення даних. Навіть приклад Mazen Harake робить це. У цьому прикладі є функція, яка повертає лише ті елементи, за якими слідує таке ж значення, тобто фільтри, задані в списку. Як правило, існують різні способи, як зробити подібну річ, яка залежить від її цілі. Список є базовою функціональною структурою, і ви можете робити дивні речі з ним, як Lisp показує нам, але ви повинні пам'ятати, це не масив.

Кожного разу, коли вам потрібно отримати доступ до i-го елементу, що повторюється, це означає, що ви використовуєте неправильну структуру даних. Ви можете створити різні структури даних, створювати списки та кортежі в Erlang, які можуть служити кращим для ваших цілей. Тому, коли ви стикаєтеся з проблемою порівняння i-го з i + 1-го елемента, ви повинні зупинитися і подумати. Що це за мету? Вам потрібно виконати деякі перетворення даних потоку , оскільки Mazen Harake чи вам потрібен довільний доступ ? Якщо ви використовуєте другий, вам слід скористатися іншою структурою даних (наприклад, масив ). Навіть тоді ти повинен думати про свої характеристики завдання. Якщо ви будете в основному читати і майже ніколи не писати, ви можете використовувати list_to_tuple (L) , а потім прочитати, використовуючи element/2 . Коли вам потрібно час від часу писати, ви почнете замислюватися про його розбиття на декілька кортежів, і, як ви зростете, коефіцієнт написання закінчиться реалізацією array .

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

П.: Є багато інших захоплюючих структур даних, за винятком списків і дерев. Наприклад, блискавки.

1
додано