Wahl der Programmiersprache zum Erlernen von Datenstrukturen und Algorithmen [geschlossen]

79

Welche Programmiersprache würden Sie empfehlen , zu lernen , über Datenstrukturen und Algorithmen in?

Berücksichtigt man Folgendes:

  • Persönliche Erfahrung
  • Sprachfunktionen (Zeiger, OO usw.)
  • Eignung zum Erlernen von DS & A-Konzepten

Ich frage, weil es einige Bücher gibt, die programmiersprachenunabhängig sind (aus mathematischer Sicht geschrieben und Pseudocode verwenden). Wenn ich aus einer dieser Methoden lerne, möchte ich eine Programmiersprache zum Codieren und Ausführen der Algorithmen auswählen.

Dann gibt es andere Bücher, in denen DS & A-Konzepte mit Beispielen vorgestellt werden, die in einer bestimmten Programmiersprache geschrieben wurden - und ich möchte diese Algorithmen auch codieren -, sodass die Sprache bis zu einem gewissen Grad auch das Buch auswählt.

In jedem Fall muss ich eine Sprache auswählen, und ich würde es vorziehen, mich durchgehend an eine zu halten. Welche persönlichen Sprachpräferenzen sind für diesen Zweck am besten geeignet?

bguiz
quelle
Es gibt keine Möglichkeit, diese Frage zu beantworten, außer in der spezifischen, und das erfordert mehr Informationen.
David Thornley
@ David Thornley: Ich verstehe, dass es ein bisschen offen ist, aber es hat viele wirklich gute Antworten bekommen!
Bguiz
Es gibt viel Lärm um die Energieeffizienz (früher: Zeit) von Algorithmen und Datenstrukturen: Wenn und wann Sie dies messen möchten, suchen Sie nach Systemen, in denen aussagekräftige Zahlen reproduzierbar (und leicht) erhalten werden.
Graubart

Antworten:

88

Die Antwort auf diese Frage hängt genau davon ab, was Sie lernen möchten.

Python und Ruby

Hochsprachen wie Python und Ruby werden häufig empfohlen, da sie Hochstufensprachen sind und die Syntax gut lesbar ist. Diese Sprachen haben jedoch alle Abstraktionen für die gemeinsamen Datenstrukturen. Nichts hindert Sie daran, Ihre eigenen Versionen als Lernübung zu implementieren, aber Sie stellen möglicherweise fest, dass Sie Datenstrukturen auf hoher Ebene auf anderen Datenstrukturen auf hoher Ebene aufbauen, was nicht unbedingt nützlich ist.

Außerdem sind Ruby und Python dynamisch typisierte Sprachen. Dies kann gut sein, aber es kann auch für den Anfänger verwirrend sein und es kann (anfangs) schwieriger sein, Fehler zu erkennen, da sie normalerweise erst zur Laufzeit sichtbar werden.

C.

C ist am anderen Extrem. Es ist gut, wenn Sie wirklich einfache Details wie die Verwaltung des Speichers erfahren möchten, aber die Speicherverwaltung ist plötzlich eine wichtige Überlegung, wie bei der korrekten Verwendung von malloc () / free (). Das kann ablenken. Außerdem ist C nicht objektorientiert. Das ist keine schlechte Sache, aber einfach erwähnenswert.

C ++

C ++ wurde erwähnt. Wie ich im Kommentar sagte, halte ich dies für eine schreckliche Wahl. C ++ ist selbst bei einfacher Verwendung schrecklich kompliziert und hat eine lächerliche Menge an "Fallstricken". Außerdem hat C ++ keine gemeinsame Basisklasse. Dies ist wichtig, da Datenstrukturen wie Hash-Tabellen von einer gemeinsamen Basisklasse abhängen. Sie könnten eine Version für eine nominelle Basisklasse implementieren, diese ist jedoch etwas weniger nützlich.

Java

Java wurde ebenfalls erwähnt. Viele Leute hassen Java gerne und es ist wahr, dass die Sprache extrem ausführlich ist und einige der moderneren Sprachfunktionen (z. B. Abschlüsse) fehlen, aber nichts davon ist wirklich wichtig. Java ist statisch typisiert und verfügt über eine Garbage Collection. Dies bedeutet, dass der Java-Compiler viele Fehler abfängt, die dynamisch typisierte Sprachen (bis zur Laufzeit) nicht haben, und dass Segmentierungsfehler nicht behoben werden (was nicht heißt, dass Sie in Java keinen Speicher verlieren können; offensichtlich können Sie dies). Ich denke, Java ist eine gute Wahl.

C #

C # Die Sprache ist wie eine modernere Version von Java. Wie Java ist es eine verwaltete (durch Müll gesammelte) kompilierte Zwischensprache, die auf einer virtuellen Maschine ausgeführt wird. Alle anderen hier aufgeführten Sprachen außer C / C ++ werden ebenfalls auf einer virtuellen Maschine ausgeführt, aber Python, Ruby usw. werden direkt interpretiert und nicht zu Bytecode kompiliert.

C # hat im Grunde die gleichen Vor- und Nachteile wie Java.

Haskell (etc)

Schließlich haben Sie funktionale Sprachen: Haskell, OCaml, Scheme / Lisp, Clojure, F # usw. Diese denken über alle Probleme auf eine ganz andere Art und Weise nach und sind es wert, irgendwann gelernt zu werden, aber es kommt wieder darauf an, was Sie lernen möchten: funktionale Programmierung oder Datenstrukturen? Ich würde mich daran halten, jeweils eine Sache zu lernen, anstatt das Thema zu verwirren. Wenn Sie irgendwann eine funktionale Sprache lernen (was ich empfehlen würde), ist Haskell eine sichere und gute Wahl.

Mein Rat

Wählen Sie Java oder C #. Beide verfügen über kostenlose, hervorragende IDEs (Eclipse, Netbeans und IntelliJ Community Edition für Java, Visual Studio Express für C #, Visual Studio Community Edition), mit denen das Schreiben und Ausführen von Code zum Kinderspiel wird. Wenn Sie keine native Datenstruktur verwenden, die komplexer als ein Array ist, und jedes Objekt, das Sie selbst schreiben, lernen Sie im Grunde das Gleiche wie in C / C ++, ohne jedoch den Speicher tatsächlich verwalten zu müssen.

Lassen Sie mich erklären: Die Größe einer erweiterbaren Hash-Tabelle muss geändert werden, wenn genügend Elemente hinzugefügt werden. In jeder Implementierung bedeutet dies, dass beispielsweise die Größe der Hintergrunddatenstruktur (normalerweise ein Array) verdoppelt und die vorhandenen Elemente kopiert werden. Die Implementierung ist grundsätzlich in allen zwingenden Sprachen gleich, aber in C / C ++ müssen Sie mit Segmentierungsfehlern umgehen, wenn Sie etwas nicht richtig zuweisen oder freigeben.

Python oder Ruby (es spielt keine Rolle, welche) wären meine nächste Wahl (und sehr nahe an den beiden anderen), nur weil die dynamische Eingabe zunächst problematisch sein könnte.

Cletus
quelle
1
@cletus: Danke für die gut begründete Antwort! Welches DS & A-Buch / anderes Lehrmaterial würden Sie empfehlen (für Java oder Python)?
Bguiz
3
@bguiz Vielleicht möchten Sie eine separate Frage dazu stellen. Zu diesem Thema gibt es mehrere Fragen, die Sie unter stackoverflow.com/search?q=book+data+structures+algoritms beantworten können. Sie können dies verfeinern, indem Sie der Suche [java] oder [python] hinzufügen.
Cletus
2
Ich würde Java und C # NICHT verwenden, hauptsächlich wegen der strengen OO-Orientierung, die dafür einfach nicht notwendig ist. Außerdem: Wen interessiert es, generischen Code zu schreiben, wenn es darum geht, die Datenstruktur zu lernen? In meinen Augen wählen Sie entweder eine Skriptsprache (Python) und konzentrieren sich auf die Hochsprache oder Sie wählen eine Niedrigsprache C / C ++ und versuchen zu sehen, wie sie auf Maschinenebene implementiert wird. Dazwischen anzuhalten scheint sich nicht zu lohnen.
Matthieu M.
3
Python wird nicht zuerst zu Bytecode kompiliert? Neuigkeiten für mich: docs.python.org/release/2.5.2/lib/bytecodes.html
Adam Crossland
Dies macht keinen Sinn: „Dies ist wichtig, da Datenstrukturen wie Hash-Tabellen von einer gemeinsamen Basisklasse abhängen.“ Hash-Tabellen basieren darauf, dass die Elemente hashbar sind, aber die Einzelheiten, wie dies in einer Programmiersprache implementiert werden kann, sind für die abstrakte Definition einer Datenstruktur irrelevant.
Pyon
44

Ich würde vor Javaallem empfehlen, weil:

  • Müllabfuhr
  • Verweise
  • reiche Sammlungen

EDIT: Down Wähler bitte erklären.

Codaddict
quelle
3
Warum stimmen alle ab?
Mantas Vidutis
19
Ich denke, dies abzulehnen, weil Sie Java nicht mögen (was zu passieren scheint), ist unverantwortlich. Sie mögen Java vielleicht nicht, aber es ist einfach genug, um es als Lernsprache zu verwenden. Also +1 von mir.
Cletus
7
+1. Nicht meine Wahl, aber es ist wirklich nicht schrecklich. Die Stimmenzahl entspricht der von Ihnen vorgeschlagenen COBOL.
Rob Lachlan
4
+1, weil für Anfänger: 1. Genau genommen müssen Sie sich keine Gedanken über die Speicherzuweisung / Freigabe machen (zumindest für kleine Programme). Sie könnten sich stattdessen auf das konzentrieren, was Sie im Moment lernen müssen. 2. Ja, keine hinterhältigen Zeiger oder Zeiger auf Zeiger. Versteh mich nicht falsch, ich liebe C ++. 3. Die Sammlungen in Java sind wahrscheinlich die raffiniertesten Datenstrukturen, die ich je gesehen habe. Sie sollten wirklich im Wörterbuch unter Datenstrukturen sein. :)
Crunchdog
9
Wenn Sie nicht verstehen, wie Sie Ihr eigenes Ressourcenmanagement durchführen, haben Sie nicht viel über Datenstrukturen gelernt.
Alan
29

Meiner Meinung nach ist C die beste Sprache, um Datenstrukturen und Algorithmen zu lernen, da Sie dadurch gezwungen werden, Ihre eigenen zu schreiben. Es wird Sie dazu zwingen, Zeiger, dynamische Speicherzuweisung und die Implementierungen hinter den gängigen Datenstrukturen wie verknüpften Listen, Hash-Tabellen usw. zu verstehen. Viele dieser Dinge können in höheren Sprachen (Java, C # usw.) als selbstverständlich angesehen werden. ).

Taylor Leese
quelle
10
Zeiger und dynamische Speicherzuweisung lehren Sie nichts über Datenstrukturen und Algorithmen, aber sie behindern ernsthaft, was Sie erreichen können.
JD
1
Genau. Nachdem ich mich mit Dutzenden verschiedener Sprachen befasst hatte und zuerst eine übergeordnete, hoch abstrahierte Sprache gelernt hatte, war es ein Schmerz, als ich mich entschied, C / C ++ zu lernen, und plötzlich musste ich mich mit vielen Dingen befassen, die mir nie erklärt wurden Vor. Das Erlernen von C zuerst (nicht C ++) ist eine gute Wahl, da es Ihnen zeigt, wie die Maschine tatsächlich funktioniert, und Sie alle Einschränkungen haben, die das Erstellen von Datenstrukturen erzwungen haben. Alle Sprachen, die Sie erhalten, sind Funktionen (für Algorithmen) und Strukturen (für Datenstrukturen). Die Lücke zwischen Theorie und Sprache ist wirklich winzig.
Rafael Beckel
17

Pythonist toll. Einfach zu lesen, voll ausgestattet. Wenn Sie mit Pseudocode arbeiten, wird Python ziemlich vertraut aussehen.

Python ist bereits die bevorzugte Sprache für Algorithmen an der UC Irvine , wo es folgendermaßen beschrieben wird:
" Python stellt eine algorithmisch orientierte Sprache dar, die in der Bildung dringend benötigt wurde. Zu den Vorteilen von Python gehört die lehrbuchartige Syntax und Interaktivität, die zum Experimentieren anregt . "

Python arbeitet auch anfängerfreundlich mit Gato , einem Tool zum Erstellen von Grafiken. Das Erlernen von Algorithmen und Datenstrukturen ist eine der wichtigsten Möglichkeiten, um visuell dargestellt zu werden. Dies macht Gato einfach (ohne komplexe Grafikbibliotheken zu erlernen).

Mantas Vidutis
quelle
@mvid: Gibt es ein Python-basiertes DS & A-Buch, das Sie empfehlen würden?
Bguiz
1
@bguiz: Obwohl ich es nicht persönlich gelesen habe, existiert dieses kostenlose elektronische Buch, das sich auf Algorithmen und Datenstrukturen mit OO in Python konzentriert: brpreiss.com/books/opus7
Mantas Vidutis
Python ist nur dann großartig, wenn Sie das Codieren mit Leerzeichen als Delimeter für fantastisch halten
Woot4Moo
Leerzeichen als Trennzeichen sind fantastisch!
Marcel Valdez Orozco
Ich habe eine persönliche Abneigung gegen Python wegen der syntaktischen Verwendung von Einrückungen. Ich finde es schwieriger, alberne Fehler aufgrund von Fehlausrichtungen zu finden, als dies bei Syntaxen mit geschweiften Klammern und dergleichen der Fall wäre, die durch eine zusätzliche nroff-ähnliche Ausrichtung unterstützt werden.
Michael
13

Wenn der Zweck darin besteht, nur Datenstrukturen und Algorithmen kennenzulernen , würde ich JavaScript sagen. Sie können Ihren Code in einem Browser ausführen. Sie haben eine sehr flexible Objekthandhabung und können sich ganz auf die Datenstrukturen und Algorithmen konzentrieren und nicht auf die Speicherverwaltung, Sprachkonstrukte oder andere Dinge, die den Fokus von der eigentlichen Informatik, die Sie lernen, ablenken.

Der Bonus ist auch, dass Sie verschiedene Datenstrukturen einfach visualisieren können, indem Sie mit dem Browser Grafiken und Bäume mit DOM und Canvas rendern.

CS-Kurse ändern im Laufe der Jahre in der Regel die Sprache, in der das Fach unterrichtet wird, einfach weil neuere und bessere Implementierungen von Sprachen eingeführt wurden, die das Lernen erleichtern und es einfacher machen, sich auf das eigentliche Problem zu konzentrieren.

Ernelli
quelle
+1, weil man mit JavaScript die funktionale Programmierung leicht erlernen kann und mit der breiten Anwendbarkeit Webanwendungen damit entwickeln kann.
Dan Dascalescu
Sehr richtig. Ich teste meinen Code im Dev Tools Snippet. In ähnlicher Weise kann ich auch meine eigenen Datenstrukturen darin schreiben. Es sind keine verknüpfte Liste oder andere Strukturen darin integriert. Alles ist nur ein Objekt. Wenn ich keine wettbewerbsfähige Programmierung mache, funktioniert es, um binäre Suche, Trie und alle anderen Konzepte zu lernen. Nein?
HalfWebDev
Stimmen Sie voll und ganz zu, konzentrieren Sie sich auf die Logik ohne viel Zeremonie und Bare-Bones-Syntax.
Jtroconisa
8

Wenn Sie den Weg des geringsten Widerstands beschreiten möchten, dann Python. Es wird die minimale Menge an unnötiger Kesselplatte und dergleichen haben.

Idealerweise möchte ich Algorithmen in C lernen, damit Sie lernen können, was auf Speicherebene vor sich geht. Ich möchte auch Algorithmen in einer funktionalen Sprache lernen, damit Sie sehen können, wie ähnliche Algorithmen mit persistenten Datenstrukturen funktionieren.

Knuths berühmte Bücher enthalten große Mengen an (erfundener Plattform-) Assembler-Code. Dies wird empfohlen, wenn Sie Super-Hardcore sein möchten. Persönlich habe ich jedoch in C gearbeitet, als ich meine Algorithmusklasse durchgearbeitet habe (Offenlegung: Dies war erst vor ein paar Jahren). Ich arbeite manchmal an einigen Problemen in Knuth, aber ich weiß nicht, ob ich MMIX als meine bevorzugte Sprache für Lernalgorithmen verwenden würde. Es ist ein bisschen übertrieben, würde ich fühlen.

EDIT : Es hängt auch davon ab, was Sie kennen. Wenn Sie jetzt mit dem Durcharbeiten eines Algorithmus-Textes beginnen möchten und noch nie viel mit C gearbeitet haben, ist Python mit Abstand die richtige Antwort. Sie möchten, dass die Sprache keine große Hürde ist, die Sie überwinden müssen, weil Sie dies genießen möchten. Ich weiß, dass ich es getan habe.

Letzter Punkt: Zumindest als ich Algorithmen lernte, habe ich verdammt viel Zeit damit verbracht, auf Papier zu arbeiten. Ich denke, das ist wichtig - ich meine, Sie möchten etwas über Asymptotik usw. lernen. Die ganze Zeit damit verbringen, Algorithmen in einer beliebigen Sprache zu implementieren, ist nicht das Richtige.

Rob Lachlan
quelle
@ Rob Lachlan: Gibt es ein Python-basiertes DS & A-Buch, das Sie empfehlen würden?
Bguiz
@bguiz: Die meisten anständigen Bücher über Algorithmen, die ich mag, sind sprachunabhängig - Cormen et al., Kleinberg und Tardos. Ich würde wirklich keine aufgrund der Sprache auswählen.
Rob Lachlan
8

Ich würde Ada vorschlagen. Es verfügt über Funktionen für Datenkonstrukte, die nicht in anderen Sprachen gefunden wurden, wie z. B. Bereichsprüfungen. type Day is range 1 .. 31;Außerdem verfügt es über eine sehr strenge Überprüfung der Kompilierungs- und Laufzeit (es sei denn, Sie deaktivieren sie), um das Auffinden von Fehlern in Ihrer Implementierung zu erleichtern.

Daniel Rose
quelle
8

Oberon-2 oder Component Pascal . Der letzte ist eine Obermenge des ersten.

Einstein sagte einmal: "Mach es so einfach wie möglich, aber nicht einfacher." Dieser Satz wurde von Prof. Niklaus Wirth als Inschrift zum ursprünglichen Oberon-Sprachbericht gewählt. Und es gilt für Oberons Nachkommen, die oben erwähnt wurden.

Wenn es um die Perfektion der Programmiersprache geht, zitiere ich gerne Antoine de Saint-Exupéry: "Ein Designer weiß, dass er zur Perfektion gelangt ist, nicht wenn es nichts mehr hinzuzufügen gibt, sondern wenn es nichts mehr zum Mitnehmen gibt." . Wirth ist auf dem richtigen Weg, auch wenn dies nicht erreicht wird. In "Wirth Programmiersprachen Zeile" (Algol -> Pascal -> Modula-2 -> Oberon -> Oberon-2) ist jede nachfolgende Sprache einfacher und gleichzeitig leistungsfähiger als die vorherige.

Leistungsstarke, aber einfache Sprachen nach dem Prinzip der geringsten Überraschung. Starke statische Typisierung, einfache objektorientierte Funktionen, Speicherbereinigung. Die Funktionsliste ist nicht groß, aber es reicht aus, um produktiv zu sein und die Dinge nicht zu komplizieren, insbesondere in der Anfangsphase.

Wenn Sie Algorithmen und Datenstrukturen lernen möchten, meinen Sie das auch so. Aber wenn Ihre Sprache "mächtig" ist (viele Funktionen wie C ++, C #, Java, Python, ...), verschwenden Sie viel Zeit mit dem Erlernen der Sprache, nicht mit Algorithmen und Datenstrukturen. Sie werden den Wald vor lauter Bäumen nicht sehen. =) Sie können sich Bäume als Syntaxelemente (und andere Features) und Forest als wichtiges Konzept vorstellen (jeder Algorithmus, jede Datenstruktur, kann OOP sein, was auch immer). Je mehr Funktionen (Bäume) Sie in Ihrer Sprache haben, desto komplizierter wird die Aufgabe, einen Schritt zurückzutreten und die Konzepte zu verstehen (den Wald zu sehen).

Aber wenn die Sprache wirklich mächtig ist (mit kleinen, bewährten Funktionen), belegt die Sprache selbst den zweiten Platz. Es gibt nicht so viele Bäume, so dass Sie ein paar Schritte zurücktreten können und ... Nun, ich denke, das sind genug Analogien. =)

Auch viele Bücher über Algorithmen und Datenstrukturen verwenden Algol / Pascal-ähnlichen Pseudocode und es wird einfach sein, Beispiele in diese Sprachen zu konvertieren. Und Sie können direkt Beispiele aus Wirths Buch "Algorithmen und Datenstrukturen" verwenden. Oberon Edition (2004), PDF (1,2 MB).

Einige zusätzliche Links:

Wilde Katze
quelle
@kemiisto: danke für die einheitliche und neuartige Antwort - und die Analogien! Ich werde auch in Oberon-2 schauen.
Bguiz
2
Die englische Version des Sprichworts lautet "Ich kann den Wald vor lauter Bäumen nicht sehen."
Daniel Rose
6

"Wenn Ihr einziges Werkzeug ein Hammer ist, sehen alle Ihre Probleme wie Nägel aus."

Lerne mindestens ein paar Sprachen.

Auch Ihre Wahl hängt von Ihrem Zweck ab.

Hobby? Job in der Windows-Welt? Linux / UNIX-Familie?

Art der Anwendungen: Business versus Scientific; Hardwaretreiber oder Anwendungen?

Desktop-Anwendungen oder Webanwendungen?

Ich habe mehrere Vorschläge für Sie.

(a) Lernen Sie auf jeden Fall etwas J (kostenlos von jsoftware.com; Nachfolger von APL; sowohl J als auch APL sind Kreationen von Ken Iverson, Turing-Gewinner ... Der Turing-Preis ist wie der Nobelpreis für Computer).

(b) Wenn Sie sich in der Windows-Welt befinden, beginnen Sie mit c #, da in .NET so viel auf c # ausgeführt wird. Wenn Sie können, erhalten Sie eine Kopie von Tom Archers "Inside c #" von Microsoft Press. Sie können ein kostenloses c # -Entwicklungssystem erhalten, indem Sie die Express-Version von Microsoft herunterladen.

(c) lernen, TDD / BDD zu verwenden ... unabhängig von der Sprache schreiben Sie zuerst einen kleinen Test, der als Komponententest bezeichnet wird; Als nächstes schreiben Sie den Produktionscode, um den Komponententest zu bestehen. Schritt für Schritt ... es ist nicht nur die Sprache, die Sie verwenden, sondern auch die Methodik.

(d) etwas Assembler-Sprache lernen ... Assembler ist eine niedrige, fast maschinelle Sprache, die Ihnen ein gutes Verständnis dafür gibt, was hinter den Kulissen vor sich geht.

(e) Außerhalb der Windows-Welt würde ich c ++ empfehlen.

Es gibt keine beste Sprache.

Wenn es nur um Sprache ginge, wäre die Programmierung einfacher.

Sie möchten nicht nur sehr spezifische Algorithmen lernen, sondern auch allgemeinere Muster, die Ihnen bei der Auswahl des Lösungsansatzes für ein bestimmtes Problem helfen können.

Eines ist sicher: Wenn Sie Programmierer werden, werden Ihnen wahrscheinlich nie die Dinge ausgehen, die Sie lernen können.

gerryLowry
quelle
@ bguiz Datenstrukturen können in jeder Hinsicht vollständig sprachabhängig sein; Dies ist ein Grund für das Erlernen verschiedener Sprachen. Sie werden auch auf subtile Unterschiede stoßen, die Frustration und sogar Trauer verursachen können. Beispiel: Datentypbenennung: Bit für SQL Server ist Bool für c # und Boolean für vb. Die Größe des Datentyps variiert ebenfalls. Beispiel: int in c # ist auf 32 Bit festgelegt, wobei in c ++ seine Größe und damit seine Speicherkapazität von der Plattform abhängt. Zeichensätze wirken sich auch auf Ihre Datenstrukturgröße aus. Beispiele: 7-Bit-ASCII, 8-Bit-ASCII, Unicode. Dann gibt es feste Größe gegen Variation und so weiter.
GerryLowry
"Datenstrukturen können in jeder Hinsicht völlig sprachabhängig sein". Um die meisten rein funktionalen Datenstrukturen in einer Sprache zu implementieren, die keine Garbage Collection bietet, müssen Sie grundsätzlich einen Garbage Collector schreiben. Das ist ein ernstes Hindernis.
JD
Versuchen Sie, die deklarative Programmierung abzudecken, sobald Sie mit OO vertraut sind.
Graubart
4

Ich denke, Lisp ist einen Blick wert.

Mein erster Universitätsprogrammierkurs war in Lisp. Davor hatte ich 10 Jahre lang Programme in mehreren Sprachen geschrieben. Ich dachte, dass der erste Programmierkurs langweilig sein würde, aber ich habe mich geirrt.

Lisp ist eine sehr interessante Sprache, da sie eine sehr einfache Syntax hat. Der Fokus wechselt von der Syntax zur Funktionalität. Der funktionale Programmierstil ist auch eine äußerst wertvolle Sache zu lernen. Nach meinem Lisp-Kurs schrieb ich Programme in C ++ auf eine völlig neue, bessere Weise, dank der neuen Konzepte, die Lisp mir beigebracht hatte.

Lisp verwendet dieselbe Darstellung auch für Code und Daten, was sich für ein interessantes Algorithmusdesign mit Code öffnet, der im laufenden Betrieb generiert und dann ausgeführt wird.

Anders Abel
quelle
3

Möglicherweise schätzen Sie eine Sprache mit algebraischen Datentypen und Mustervergleich wie Standard ML, OCaml, F # oder Haskell. Hier ist beispielsweise eine Funktion zum Neuausgleichen eines in OCaml / F # geschriebenen rot-schwarzen binären Suchbaums:

let balance = function
  | R(R(a, x, b), y, c), z, d | R(a, x, R(b, y, c)), z, d
  | a, x, R(R(b, y, c), z, d) | a, x, R(b, y, R(c, z, d)) ->
      R(B(a, x, b), y, B(c, z, d))
  | a, x, b -> B(a, x, b)
JD
quelle
10
Ihr Sarkasmus wird geschätzt, Sir.
Ergosys
2

Ich kann mich irren, aber sind Datenstrukturen und Algorithmen nicht unabhängig von den Programmiersprachen?

Letztendlich sind Datenstrukturen nur eine Möglichkeit, Daten zu organisieren. Jede Hochsprache wird dies unterstützen. Sicher, bestimmte Sprachen verfügen über Mechanismen zur Implementierung grundlegender Datenstrukturen (z. B. Collections Framework in Java oder C ++ STL), aber dies hindert Sie nicht daran, Datenstrukturen in der Programmiersprache Ihrer Wahl zu programmieren. Darüber hinaus sind Algorithmen im Pseudocode geschrieben, wodurch sie sprachunabhängig werden.

Mir ist klar, dass es Ihre Frage nicht wirklich beantwortet, aber ich habe Probleme zu verstehen, wonach Sie suchen. Datenstrukturen / Algorithmen lernen oder eine neue Sprache lernen.

Pran
quelle
1
@Pran: Ich weiß, dass Algorithmen im Pseudocode sind - aber Pseudocode wird nicht kompiliert. Ich bin ein praktischer Typ-Lerner. Um die Konzepte wirklich zu verstehen, müsste ich sie in einer Sprache codieren, die kompiliert und ausgeführt werden kann. Daher ist meine Frage wirklich, welche Sprache dafür am besten geeignet ist, in dem Sinne, dass jede Sprache ihre eigenen Vor- und Nachteile haben könnte, sodass einige von ihnen besser zum Erlernen von DS & A geeignet sind als andere.
Bguiz
@Pran: "Ich kann mich irren, aber sind Datenstrukturen und Algorithmen nicht unabhängig von den Programmiersprachen?" Wenn die Sprache keinen GC bereitstellt, müssen Sie möglicherweise einen schreiben.
JD
2

Jede Sprache außer dem flüchtigen C ++ sollte gut funktionieren.

Jeremy Jose
quelle
0

Ich bevorzuge C ++ :)

Prasoon Saurav
quelle
19
-1 C ++ ist eine schreckliche Lernsprache (und Sie können das Qualifikationsmerkmal "Lernen" möglicherweise aus dieser Aussage streichen).
Cletus
4
Er muss nicht die dunklen Ecken von C ++ lernen, um seine Algorithmen in C ++ zu codieren. C ++ ist vollkommen in Ordnung.
Prasoon Saurav
9
Sie halten es also für eine gute Idee, eine Klasse für einen DS in C ++ zu codieren und sich über die Unterschiede zwischen einem Kopierkonstruktor und dem Überschreiben des Gleichheitsoperators, Referenzen und Zeigern, die den Gültigkeitsbereich verlassen, und Speicherverlusten durch falsches Neu / Löschen zu informieren Nutzung usw.? All dies ist für C ++ ziemlich grundlegend.
Cletus
5
Aber der Punkt ist, dass Sie diese Dinge nicht in Python oder Java lernen müssen. C ++ erfordert eine viel größere Anfangsinvestition und ist in keiner Weise wertvoller für die angeforderte Funktion des OP
Mantas Vidutis
2
Gibt es einen gültigen Grund für Javascript, der nicht zum Lernen von @cletus empfohlen wird?
HalfWebDev