Tracks
/
Clojure
Clojure
/
Übungen
/
Listenoperationen
Listenoperationen

Listenoperationen

Mittel

Anleitung

Implementiere grundlegende Listenoperationen.

In funktionalen Sprachen sind Listenoperationen wie length, map und reduce sehr verbreitet. Implementiere eine Reihe grundlegender Listenoperationen, ohne vorhandene Funktionen zu verwenden.

Die genaue Anzahl und die Namen der Operationen, die du implementieren sollst, hängen vom jeweiligen Track ab, damit es keine Konflikte mit vorhandenen Namen gibt. Die allgemeinen Operationen, die du implementierst, sind:

  • append (füge bei zwei gegebenen Listen alle Elemente der zweiten Liste ans Ende der ersten Liste an);
  • concatenate (kombiniere bei einer Reihe von Listen alle Elemente aller Listen zu einer einzigen flachen Liste);
  • filter (gib bei einem Prädikat und einer Liste die Liste aller Elemente zurück, für die predicate(item) True ist);
  • length (gib bei einer Liste die Gesamtzahl der darin enthaltenen Elemente zurück);
  • map (gib bei einer Funktion und einer Liste die Liste der Ergebnisse zurück, die du erhältst, wenn du function(item) auf alle Elemente anwendest);
  • foldl (wenn du eine Funktion, eine Liste und einen Anfangswert für den Akkumulator hast, falte (reduziere) jedes Element von links in den Akkumulator);
  • foldr (wenn du eine Funktion, eine Liste und einen Anfangswert für den Akkumulator hast, falte (reduziere) jedes Element von rechts in den Akkumulator);
  • reverse (gib bei einer Liste eine Liste mit allen ursprünglichen Elementen zurück, aber in umgekehrter Reihenfolge).

Beachte, dass die Reihenfolge, in der die Argumente an die fold-Funktionen (foldl, foldr) übergeben werden, wichtig ist.

Anhang

Note

Die obigen Anweisungen werden mit einem gemeinsamen Repository synchronisiert, um Konsistenz über alle Sprach-Tracks hinweg zu gewährleisten. Dieser Anhang enthält zusätzliche Erläuterungen oder ändert die Anweisungen nach Bedarf, damit sie besser zu den Zielen des Clojure-Tracks passen.

Gehe bei dieser Übung im Clojure-Track davon aus, dass sowohl die Eingabe als auch die Ausgabe Vektoren sind, wie die Tests zeigen. Als weiterführendes Ziel kannst du dir überlegen, wie du einen Ansatz umsetzt, der für Zwischenschritte keine Listen verwendet.

Es ist wichtig, keine vorhandenen eingebauten Funktionen von Clojure mit ähnlicher Funktionalität wiederzuverwenden, denn das würde den beabsichtigten Lernerfolg der Übung schmälern. Wichtige Funktionen aus dem Namespace clojure.core, die du vermeiden solltest, sind into, concat, cat, lazy-cat, mapcat, flatten, filter, filterv, remove, count, map, mapv, reduce, transduce, reverse und rseq.

Optionale Ziele

Das optionale Ziel ist für alle gedacht, die eine zusätzliche Herausforderung suchen, und setzt voraus, dass du das Hauptziel bereits erreicht hast.

Versuch, die Tests mit einem Ansatz zu bestehen, der davon ausgeht:

  • Dass sowohl die Eingabe als auch die Ausgabe Listen statt Vektoren sind. Beachte, dass die Tests wie üblich nicht geändert werden müssen.
  • Dass Vektoren nicht für Zwischenschritte verwendet werden dürfen.

Wenn du dich entscheidest, das zu veröffentlichen, füge unbedingt einen Kommentar hinzu, der deutlich macht, dass es um das optionale Ziel geht, Listen zu verwenden. Vergiss nicht, die Docstrings zu aktualisieren!

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Clojure Exercism

Bereit, mit Listenoperationen zu starten?

Melde dich bei Exercism an, um Clojure mit 12 Konzepte105 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.

Tauche tiefer in Listenoperationen ein!

Genieße eine praktische Einführung in die Rekursion, erkunde die imperativen und funktionalen Alternativen zu Listenoperationen und tauche tief in Endrekursion und Akkumulatorfunktionen ein.