Het vergelijken van arrays-elementen in Erlang

Ik probeer te leren denken op een functionele programmeerwijze, hiervoor probeer ik Erlang te leren en eenvoudige problemen op te lossen met codingbat. Ik kwam met het algemene probleem van het vergelijken van elementen binnen een lijst. Vergelijk bijvoorbeeld een waarde van het i-de positie-element met de waarde van de i + 1-de positie van de lijst. Dus ik heb nagedacht en gezocht hoe dit op een functionele manier in Erlang (of welke functionele taal dan ook) te doen.

Wees alsjeblieft voorzichtig met mij, ik ben erg newb in deze functionele wereld, maar ik wil leren

Bij voorbaat dank

4

2 antwoord

Definieer een lijst:

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

Definieer een functie f, die een lijst opneemt

  • Als het overeenkomt met een lijst van één element of een lege lijst, retourneert u de lege lijst
  • Als het overeenkomt met het eerste element en het tweede element, neemt u het eerste element en construeert u een nieuwe lijst door de rest van de lijst opnieuw te gebruiken
  • Sla anders het eerste element van de lijst over.

In Erlang-code

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

Functie toepassen

f(L)

Dit zou moeten werken ... niet gecompileerd en uitgevoerd hebben, maar het zou u op weg moeten helpen. Ook voor het geval u wijzigingen moet aanbrengen om het anders te gedragen.

Welkom in Erlang;)

4
toegevoegd

Ik probeer zachtaardig te zijn ;-) Dus het belangrijkste in functionele benadering is denken in termen: wat is input? Wat moet er worden geproduceerd? Er gaat niets boven het vergelijken van het i-de element met het i + 1-ste element alleen. Er moet altijd een doel zijn dat zal leiden tot datatransformatie. Zelfs het voorbeeld van Mazen Harake doet het. In dit voorbeeld is er een functie die alleen elementen retourneert die worden gevolgd door dezelfde waarde, d.w.z. filters gegeven lijst. Meestal zijn er heel verschillende manieren hoe vergelijkbaar iets is dat afhankelijk is van het doel ervan. Lijst is een basis functionele structuur en je kunt er verbazingwekkende dingen mee doen zoals Lisp ons laat zien maar je moet onthouden dat het geen array is.

Elke keer dat u toegang nodig hebt tot i-de element herhaalbaar, geeft dit aan dat u de verkeerde datastructuur gebruikt. Je kunt verschillende datastructuren vormen, lijsten en tuples in Erlang, die je doelen beter kunnen dienen. Dus wanneer je problemen tegenkomt om i-th te vergelijken met i + 1-ste element, moet je stoppen en nadenken. Wat is het doel ervan? Heeft u wat stream datatransformatie nodig als Mazen Harake doet of heeft u willekeurige toegang nodig ? Als u ten tweede een andere datastructuur gebruikt ( array bijvoorbeeld). Zelfs dan zou je moeten nadenken over je taakkenmerken. Als u meestal wordt gelezen en bijna nooit schrijft, kunt u list_to_tuple (L) gebruiken en vervolgens lezen met behulp van element/2 . Wanneer je af en toe iets moet schrijven, begin je erover na om het te partitioneren tot meerdere tuples en naarmate je schrijfratio groter wordt, kom je terecht in de array -implementatie.

Dus je kunt lijsten gebruiken: nth/2 als je het slechts één of meerdere keren wilt doen, maar op een shortlist en je bent geen performance-freak zoals ik ben. U kunt het verbeteren met behulp van [X1, X2 | _] = lijsten: nthtail (I-1, L) ( L = lijsten: nthtail (0, L) werkt als verwacht). Als u met grotere lijsten te maken krijgt en u wilt het vele keren noemen, moet u uw aanpak opnieuw bekijken.

P.S .: Er zijn veel andere fascinerende gegevensstructuren behalve lijsten en bomen. Ritsen bijvoorbeeld.

1
toegevoegd