Erlang ішіндегі массив элементтерін салыстыру

Мен функционалдық бағдарламалау әдісімен ойлауды үйренгім келеді, сондықтан Эрлангты үйренуге тырысамын және кодтық блоктан оңай проблемаларды шешуге тырысамын. Мен тізімдегі элементтерді салыстырудың жалпы проблемасымен келдім. Мысалы, i-ші позиция элементінің мәнін тізімнің i + 1-ші позициясымен салыстырыңыз. Мен Эрлангта (немесе кез-келген функционалдық тілде) функционалды жолмен қалай әрекет етуді ойлап, іздеймін.

Менімен жұмсақ болыңыз, мен осы функционалдық әлемде жаңадан шықтым, бірақ мен үйренгім келеді

Алдын-ала рақмет

4

2 жауаптар

Тізімді анықтаңыз:

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)

Бұл жұмыс істеу керек ... оны құрастырып, іске қосқан жоқ, бірақ ол сізді бастау керек. Сондай-ақ, өзіңізге әр түрлі өзгерістер жасау үшін оны өзгерту керек.

Erlang-қа қош келдіңіз;)

4
қосылды

Мен нәзік болуға тырысамын ;-) Сондықтан функционалдық тұрғыдан бастысы мынада: ойлау дегеніміз не? Нені шығару керек? I-ші элементін i + 1-ші элементпен бір-бірімен салыстыру сияқты ештеңе жоқ. Деректердің өзгеруіне әкелетін әрқашан оның мақсаты болуы керек. Тіпті оның мысалы Mazen Harake . Бұл мысалда тек бірдей мәнді сақтайтын элементтерді қайтаратын функция бар, яғни берілген тізімдегі сүзгілер. Әдетте мұндай мақсаттарға байланысты ұқсас нәрсені қалай жасауға болады. Тізім негізгі функционалдық құрылым болып табылады және сіз оны таңғажайып нәрселер жасай аласыз, себебі Lisp бізге көрсеткендей, бірақ сіз оны массив емес деп есте сақтауыңыз керек.

I-ші элементіне кіру қажет болған сайын қайталанатын болса, ол деректердің дұрыс құрылымын пайдаланып жатқандығын көрсетеді. Эрлангта әртүрлі деректер құрылымдары тізімдерін және кілттерін құрастыруға болады, ол сіздің мақсаттарыңызға жақсы қызмет көрсете алады. Сондықтан i-th-ді i + 1-ші элементпен салыстыру үшін қиындықтар пайда болған кезде сіз тоқтап, ойланыңыз. Бұл не? Mazen Harake ретінде кейбір stream деректерін қайта жасау қажет пе немесе сізге кездейсоқ кіру қажет ? Екіншіден, сіз әртүрлі деректер құрылымын қолданыңыз (мысалы, array ). Сонда да сіз өзіңіздің тапсырмаңыздың сипаттамалары туралы ойлауыңыз керек. Егер сіз көбінесе оқып, дерлік ешқашан жазбасаңыз, list_to_tuple (L) пайдалана аласыз, содан кейін element/2 пайдалана отырып оқыңыз. Кейде жазуды қажет етсеңіз, оны бірнеше бөлікке бөлу туралы ойлауды бастайды және сіздің жазу коэффициентіңіз өсетіндіктен array іске асырылуымен аяқталады.

Сонымен, сіз тізімдерін пайдалануға болады: nth/2 , егер сіз оны бір немесе бірнеше рет жасасаңыз, бірақ қысқа тізімде болсаңыз және мен болсам, сіз сияқты өнімділік емессіз. Сіз оны [X1, X2 | _] = тізімдерін пайдалана отырып жақсарта аласыз: nthtail (I-1, L) ( L = тізімдер: nthtail (0, L) ) күтілуде). Егер сіз үлкен тізімдерге тап болсаңыз және оған бірнеше рет қоңырау шалғыңыз келсе, өз көзқарасыңызды қайта қарастырыңыз.

P.S .: Тізімдер мен ағаштардан басқа басқа да көптеген қызықты деректер құрылымдары бар. Мысалы, фрезерлар.

1
қосылды