Lerne Coding

{04} Algorithmen für Einsteiger: Die Demystifizierung der Grundlagen

06.01.2023
Inhaltsverzeichnis
[[TABLE OF CONTENTS]]

Shownote zur Episode {04}

{00:02:17} ChatGPT – ist eine neue KI von OpenAI, die am 30. November 2022 zum ersten Mal veröffentlicht wurde. Diese ein Chatbot Prototyp die verschiedene Fragen beantworten kann in vielen verschiedenen Sprachen. Google sieht sie als aktive Konkurrenz zur Suche, da diese konkrete Fragen beantworten kann. In der Episode stellen wir fest, dass es an sich ein sehr interessantes Projekt ist – aber in Details häufig falsch liegt. Google hat bereits „Code Red“ ausgerufen, so heißt es – da es sehr große Konkurrenz in der KI sieht, mehr dazu unter: https://www.seo-suedwest.de/8511-chatgpt-alarmstufe-rot-bei-google.html

{00:09:35} Github Copilot ist eine KI, die einem im Code Editor mit nützliche Autovervollständigungen, die beim Programmieren unterstützen können.

{00:10:37} Aufgrund von Urheberrechten und Lizenzverletzungen wurde eine Klage gegen Microsoft, Github und OpenAI eingereicht. Da die KI von Github Copilot die Lizenzrechte der Repositorys auf Github nicht beachtet. Mehr dazu kann auch noch mal unter: https://www.heise.de/news/Microsoft-GitHub-und-OpenAI-verklagt-KI-Programmierhilfe-Copilot-kopiert-Code-7331566.html nachgelesen werden.

{00:14:02} Die Fibonacci-Folge ist eine unendliche Folge von Zahlen, wobei die nächste Zahl immer die Summe aus den 2 vorhergegangen Zahlen ist. Diese Folge kommt in der Natur an verschiedensten Stellen vor. Der Goldene Schnitt basiert auf der Fibonacci-Folge – zum Beispiel werden Menschen, deren Gesicht dem Golden Schnitt entsprechen als besonders ästhetisch wahrgenommen.

{00:16:09} Im Artikel „Wie nutze ich rekursive Funktionen in PHP?“ - beschreibe ich einmal die Rekursion am Beispiel einer Fakultätsfunktion.

{00:20:29} Der Bubblesort-Algorithmus erwartet eine Liste von Zahlen, diese Zahlen werden dann aufsteigende sortiert. Die Sortierung basiert immer auf einem Wertepaar, wobei man von einem Linken und einem Rechten Wert spricht. Dabei werden kleine Werte nach links zum Anfang verschoben und große Werte nach rechts, also zum Ende hin. Im Artikel „Den Bubblesort-Algorithmus verwenden in Java“ zeige ich dir eine entsprechende Implementierung für Java.

{00:21:09} Bei Brutforce „Rohe Gewalt“ Algorithmen handelt es sich um Algorithmen – wo einfach alles ausprobiert wird, was eine mögliche Eingabe wäre. Anschließende wird der Wert abgesendet oder geprüft, wenn danach ein „ok“ zurückkommt, dann sind wir fertig. Falls kein „ok“ zurückkommt, wird die Eingabe um einen Wert weiter gezählt und wieder versucht, solange bis eine Lösung gefunden wird.

{00:24:13} Project Euler ist eine Webseite, um Mathematikprobleme zu lösen. Es werden insgesamt 813 Probleme zum Lösen angeboten. Das im Podcast vorgestellte Problem war das Erste auf der Seite.

{00:25:56} Advent of Code gibt es seit 2015 - es werden jedes Jahr 25 Rätsel (Ein Rätsel besteht aus 2 Teilen) als Adventskalender zur Verfügung gestellt, die gelöst werden können – dafür sind Programmierkenntnisse notwendig, anhand der Aufgaben kann man seine Fähigkeiten verbessern. Auch im Nachhinein können alle Rätsel aus den vergangenen Jahren bearbeitet werden, falls du direkt loslegen willst.

{00:31:35} CodeAbbey ist ähnlich wie Project Euler aufgebaut und bietet auch teilweise deutschsprachige Übersetzungen, was es Einsteiger:innen noch leichter machen sollte. Programmierer:innen müssen für diese Rätsel keine fortgeschrittenen Kenntnisse haben; man kann sich an den Aufgaben stetig in seinen Programmierkenntnissen verbessern. Insgesamt stellt die Plattform 326 Probleme zur Verfügung.

{00:32:44} LeetCode ist ebenfalls ähnlich zu CodeAbbey mit dem Unterschied, dass die Plattform auch einen größeren kommerziellen Touch hat, diese sollte man beachten. Dafür ist die Oberfläche deutlich ansprechender gestaltet.

{00:33:17} Clash of Code auf Coding Game ist ein kompetitives Spiel für das Programmieren von Algorithmen. Wer die kürzeste Antwort in der schnellsten Zeit findet, gewinnt.

{00:35:19} Unser Discord Server steht jeder Person zur Verfügung, die sich zum Podcast oder auch allgemein zu Themen des Programmierens austauschen möchte oder dazu lernen will!

Zusammenfassung

In dieser Podcast-Episode haben wir uns mit zwei Hauptbereichen beschäftigt. Zuerst sind wir noch einmal auf die Podcast-Episode 03 eingegangen, da mit ChatGPT eine sehr interessante freie KI für das Erstellen von Texten auf den Markt gekommen ist. Im Detail erzählen wir von verschiedenen Beispielen, in denen diese KI ihre vor, aber auch Nachteile besitzt. Sie hat etwa sich bei meinem Test mit der Bitte um Programmierlösungen eigenen Funktionen ausgedachte, die so gar nicht in zum Beispiel WordPress existieren – und somit war die Lösung der KI falsch. In anderen Fällen bei der Unterstützung in der Erstellung von Texten hat die KI zum Teil großartige Arbeit gemacht. Anschließende beschäftigen wir uns mit unserem eigentlichen Thema, den Grundlagen von Algorithmen, genauer gesagt wie man lernt diese sinnvoll zu Schreiben. Unter anderem stellen wir fünf Webseiten, vor, die dir dabei helfen können, besser zu werden.

Kapitel - Übersicht

  • {00:00:00} - Einleitung
  • {00:01:25} - Erklärung des heutigen Themas
  • {00:01:45} - Thema ChatGPT
  • {00:03:26} - Was ist ChatGPT von OpenAI eigentlich?
  • {00:04:03} - Weitere Beispiele für die Verwendung von ChatGPT
  • {00:08:13} - Fazit zu ChatGPT von OpenAI
  • {00:09:35} - Github CoPilot - Erklärung & Rechtliches?
  • {00:11:26} - Einleitung Thema: Demystifizierung von Algorithmen
  • {00:14:00} - Beispiel für Algorithmen – Fibonacci-Folge
  • {00:16:09} - Was ist eine Rekursion? Und wann ist die Verwendung sinnvoll?
  • {00:20:15} - Was gibt es für Typen von Algorithmen?
  • {00:22:43} - Wie wird man besser, Algorithmen zu programmieren und Probleme zu lösen?
  • {00:23:50} - Webseiten, die einem helfen können, besser zu werden beim Programmieren
  • {00:34:44} - Schlussworte

Audio Transkription der Podcast Episode

{00:00:00}Leon sagt: Moin und herzlich willkommen zur vierten Episode des HelloCoding.de Podcasts. Ich bin Leon.

{00:00:06}Felix sagt: Und ich bin Felix.

{00:00:08}Leon sagt: Du sag mal, meine Shift-Taste vom MacBook hat gestern wieder geklemmt. Hattest du das auch schon mal?

{00:00:13}Felix sagt: Häufiger schon, ja. Aber nicht an den neuen. Nur an den alten.

{00:00:22}Leon sagt: Ich jetzt vom M1, von der 2020er Variante, habe ich das jetzt schon das zweite Mal gehabt.

{00:00:23}Felix sagt: Okay, bei den M1 Max hatte ich das noch gar nicht.

{00:00:39}Leon sagt: Das letzte Mal war es die Shift-Taste. Aber bei der Shift-Taste bin ich ja wirklich noch in den Apple Store reingegangen und habe die dann wechseln lassen. Diesmal habe ich was anderes ausprobiert. Ich bin zum Freund gegangen, der einen Kompressor zu Hause stehen hat und da habe ich meinen MacBook durchpusten lassen. Und siehe da, die Taste funktioniert und ist wie neu.

{00:00:56}Felix sagt: Ja, was eigentlich auch immer reicht ist, so mache ich es immer. Einfach das Macbook in alle vier Himmelsrichtungen einmal drehen und dabei leichter reinpusten. Das reicht meistens schon.

{00:01:04}Leon sagt: Das hat bei mir nicht geklappt. Die Alternative wäre gewesen, hätte ich jetzt keinen Kompressor zur Hand gehabt, mir so ein Spray zu kaufen oder halt direkt in den Apple Store zu laufen.

{00:01:11}Felix sagt: Ja, wobei das Spray auch eigentlich besser ist als mit dem Mund reinpusten, weil so pustest du ja auch noch Partikel aus der Luft da rein, das ist nicht so gut. Beziehungsweise Feuchtigkeit vor allem.

{00:01:14}Leon sagt: Also nicht so ein Luftdruck-Spray. Aber unser Thema ist ja heute eigentlich was anderes, oder?

{00:01:26}Felix sagt: Unser Thema ist was anderes. Unser eigentliches Thema ist das wunderbare Thema Algorithmen. Bevor wir damit aber starten, möchten wir auch noch mal auf die Podcastfolge Nummer 3 eingehen, wo es um KI, Künstliche Intelligenz ging. Und da hat sich jetzt gerade in der letzten Zeit doch einiges noch mal getan. Vielleicht willst du ja noch mal einsteigen.

{00:01:44}Leon sagt: Ich glaube, du beziehst dich auf unser Gespräch von gerade eben über ChatGBT, oder?

{00:01:48}Felix sagt: Ja, genau.

{00:01:55}Leon sagt: ChatGBT ist ein neuronanes Netz, was mit einer Menge Daten trainiert wurde und mit dem man aktuell auf der Seite von OpenAI, korrigiere mich, wenn ich falsch liege.

{00:01:56}Felix sagt: Genau, das ist, ja ich kann es dir auch ganz genau sagen, chat.openai.com, da ich sie häufiger offen habe. Vielleicht übernehme ich gerade mal. Ich habe jetzt einiges schon getestet, gerade auch in Bezug auf Texterstellung ist es häufig sehr charmant damit zu arbeiten, wenn du Ideen suchst. Aber wenn es um komplette, ausformulierte Texte geht, bin ich immer noch sehr vorsichtig damit umzugehen, aus dem Grund Urheberrecht, weil das sehr schwierig noch einzuordnen ist rechtlich. Also ich habe mal auch mal so ganze Textphrase, halt ganze Abschnitte auch da durchgejagt, bzw. mir davon erstellen lassen und nur Themen vorgegeben. Dann bekommt man auch Textphrase, wenn man die so in Google haut, findet man sie so auch erstmal nicht. Problem ist allerdings, wenn du halt zum Beispiel jetzt einfach nur sagst, schreib mir einen Artikel über Java oder irgendwie sowas, dann sind die Texte sehr identisch. Also da kommen nicht immer sehr unterschiedliche Ergebnisse raus, sondern sehr gleiche Ergebnisse.

{00:03:09}Leon sagt: Ich bremse dich noch ganz kurz ab. Jetzt hast du ziemlich weit vorgegriffen. Aber dabei haben wir noch gar nicht gesagt, was ChatGBT überhaupt ist. Also im Prinzip hat man ein Web-Interface auf der genannten Webseite und kann dort mit dem neuronalen Netz chatten. Und aufgrund der Eingabe, die man ChatGBT quasi reinwirft, generiert ChatGBT auf Basis dessen Datensatzes den wahrscheinlich besten Output. Und so kommen quasi Konversationen, Lösungen zu Fragen oder sonstiges zustande. Was genau hast du denn sonst noch getestet?

{00:03:44}Felix sagt: Also was ich halt zum Beispiel auch getestet hatte oder auch zum Teil gesehen hatte, ich hatte zum Beispiel auf der Arbeit einen Fall, da musste ich Versandkosten in einem Online-Shop von WordPress so anpassen, dass mir bestimmte Produkte in einer bestimmten Konstellation im Warenkorb liegen, dass dann die Versandkosten entfallen. Das Ganze wollte ich programmieren. Es war mir schon klar, wie ich das Ganze lösen würde. Ich wollte aber mal schauen, was die KI daraus macht. Was dann sehr interessant war, die Ansätze waren wieder richtig. Problem nur war, wenn du keine Kenntnisse von WordPress hast oder von dem System dahinter, stellst du ziemlich schnell fest, dass die Antwort fachlich vollkommen falsch ist, da er sich dann Funktionsnamen ausgedacht hat, die so gar nicht existieren, weil es halt immer noch primär eine Text-KI ist, um Texte zu erstellen und dann aus Artikeln aus dem Internet auch gefüttert wurde, die dann halt vielleicht diese Funktion zur Verfügung haben, weil die halt dann noch ein zusätzliches Plugin zum Beispiel jetzt in dem Fall von WordPress installiert haben, du aber gar nicht das dann so richtig zuordnen kannst und er dann daraus versucht, etwas zu bauen, was funktionieren könnte. Wenn man jetzt so simple Sachen hat wie, schreib mir einen Algorithmus, der die Fibonacci-Folge bis zur zehnten Position durchgeht, das würde wunderbar funktionieren. Aber sobald etwas Komplexität dazu kommt oder Logik, wird es halt immer sehr schwierig.

{00:05:29}Leon sagt: Also genau, Programmcode kann man damals zum Beispiel auch generieren lassen. Wofür ich es bisher genutzt habe, war zum Beispiel für die Englisch-Hausaufgaben meiner Schwester. Nicht, dass ich jetzt kein Englisch könnte. Das war so ein Weihnachtsaufgabenblatt auf Englisch und da sind irgendwelche Sätze und Wörter durcheinandergeraten. Und da habe ich mir gedacht, mal gucken, ob das neuronale Netz auch hinbekommt, wenn ich sage, hey, hier, die Wörter sind durcheinandergeraten, gib mir bitte den besten Output dafür aus. Und ich muss sagen, bei ich sag mal so acht von zehn Wörtern habe ich sinnvolle und wahrscheinlich auch die richtigen Wörter wieder rausbekommen. Das andere, was ich gemacht habe, ich habe damit zum Beispiel eine Loading-Komponente für eine Webseite mit React mit generieren lassen. Das hat auch super funktioniert. Nachdem ich ChatGBT auf einen Fehler hingewiesen habe, hat er den Fehler selber eingesehen und auch korrigiert. Was nicht so gut geklappt hat, war Schachspielen. Ich wollte mal gucken, wie ChatGBT gegen einen Freund von mir Schach spielen könnte, indem ich quasi die ganzen Positionen immer nachgetragen habe und er sollte mir am besten sagen, welche Figur er auf welches Feld setzt. Und da hat er sich teilweise widersprochen und Dinge auf belegte Felder setzen wollen oder das hat leider nicht so gut geklappt. Aber das ist ja auch irgendwo logisch.

{00:06:58}Felix sagt: Einmal, genauer gesagt das hatte ich nur auf Twitter gelesen, da ging es darum, eine Funktion für Ruby zu erstellen und dieser hat dann auf Pakete zugreifen wollen und diese einsetzen wollen, um einen Lösungsweg zu erschließen und hat dann auf GitHub-Repositories verwiesen, die gar nicht existiert haben. Also der hat sich dann halt da irgendwelche Namen zusammengereimt, um halt dann das Ganze resultierend zu ergänzen, dass es halt valide ausschaut, wenn man halt einfach nur Text vergleicht. Aber halt, es vergleicht halt, die KI basiert halt eben nur auf Text und nicht auf einer tieferen Logik und Verständnis vom Programmieren oder sonstigen. Ein anderes Beispiel, was ich noch hatte, war, wenn es dann um Logikverständnisse ging. Das hatte ich auch auf Twitter zuerst gesehen und dann auch selber noch ein bisschen rumprobiert mit. Und zwar war die Aussage, Felix' Vater hat drei Kinder, dann nenne ich drei Kinder. Ich nenne natürlich nicht Felix in der Auflistung und dann frage ich die KI danach, nenne mir das vierte Kind. Das hat er nicht geschafft zu lösen. Also es ist halt ein sehr schönes Beispiel, dass halt kein richtiges Logikverständnis da ist. Er kam nie darauf, dass Felix ja das Kind dann ist vom Vater zusätzlich noch zu den drei anderen genannten. Das war halt auch noch so ein Beispiel, was ich halt sehr interessant fand. So im Gesamten finde ich es halt sehr interessant für so Fälle, wo es halt darum geht, so einfache Aufgaben zu lösen. Wobei dann ist auch die Frage, ob man es nicht einfach selber machen kann. Was anderes, was ich sehr interessant war, war gerade für Brainstorming, wenn es darum ging, Artikelideen zu finden. Dass man irgendwie schon, wenn ich zum Beispiel mal eine Liste reingegeben habe von schon 20 Artikeln von mir und dann mir gesagt habe, gib mir doch mal zehn Ideen, die dazu passen, könnten thematisch, was man noch ergänzen könnte. Da waren schon Sachen dabei, wo ich mir gedacht habe, okay, dazu kann ich mal was schreiben. Für solche Fälle finde ich das halt sehr interessant.

{00:08:52}Leon sagt: Was ich generell noch wichtig finde zu sagen ist, ich würde das Ganze nicht kommerziell einsetzen, gerade wenn man jetzt an Dingen für Kunden entwickelt oder so, würde ich jetzt nicht sagen, hey, das und das ist mein Programmcode, fix mal das und das Problem bitte, weil da kommt man dann rechtlich irgendwann früher oder später in so ein Ding, wo man nicht hin möchte, weil auf den Chats, die man dort ja hat, wird aktuell noch weiter gearbeitet.

{00:09:15}Felix sagt: Ich hab noch ein wunderbares Beispiel dazu in Bezug auf GitHub Copilot. Das hatte ich mir auch mal angeschaut jetzt zuletzt und auch mal ausprobiert, bei so einfachen Sachen war das auch wieder echt schön damit zu arbeiten. Also es hat ja halt einfach so ein bisschen Schreibarbeit abgenommen. Du hast halt eben nur noch gesagt, was du schreiben willst mehr oder weniger. Das war halt ganz schön. Schwierige war halt hier auch wieder das rechtliche Thema. Dann hatte ich auch noch mal so ein paar Beispiele gesehen, wenn es dann halt um komplexere Algorithmen geht und nicht mehr um so einen einfachen If-else-Case, wo man halt einfach rechtlich lizenzlich das einfach nicht nachweisen kann oder zuordnen könnte, wer jetzt zuerst eine If-else-Abfrage geschrieben hat, sag ich mal. Aber dann war es halt wirklich so, dass komplexe Algorithmen, die aus GitHub Repositories stammen, wo halt ganz klar diese lizenziert sind unter bestimmten Lizenzen und die KI hat sie so genau abgerufen ohne eine Abwandlung, sodass man es wirklich 1 zu 1 wieder der Person und der Repository zuordnen könnte, woraufhin ja auch GitHub Copilot ja auch eine Klage am Hals hat. Da bin ich ja mal sehr gespannt, wie sich das Ganze dann noch entwickeln wird. Das Schwierigste sehe ich halt immer an den ganzen KI-Themen, sei es jetzt Bildgenerierung, sei es Textgenerierung, sei es Codegenerierung oder Codeergänzung, Thema Urheberrecht, wie sich das alles entwickelt, wie man das halt auf einen gemeinsamen Nenner bringt, dass man zugleich es gut nutzen kann, aber auch nicht durchs Urheberrecht das irgendwie das Thema KI komplett uninteressant macht, für solche Bereiche einzusetzen. Es ist aber, glaube ich, auch rechtlich allgemein ein sehr schwieriges Thema, das richtig einzuordnen. Aber da werden, glaube ich, die nächsten ein, zwei Jahre auf jeden Fall noch mal zeigen, wie sich das Ganze entwickelt durch entsprechende Urteile dann auch, glaube ich.

{00:10:55}Leon sagt: Ja.

{00:11:19}Felix sagt: Gut, dann wollen wir doch jetzt mal übergehen zum eigentlichen Hauptthema und zwar Algorithmen. Was fällt dir als erstes an, wenn du an einen Algorithmus denkst?

{00:11:25}Leon sagt: Die Algorithmen und Datenstruktur vorlesung meiner Hochschule. Aber du hast vorhin die Frage, was ist dein Algorithmus ganz gut zusammengefasst? Willst du das vielleicht sonst nochmal in eigenen Worten wiederholen?

{00:11:33}Felix sagt: Lernstandsabfrage in der Schule, ja, kann ich gerne tun. Also, bei einem Algorithmus geht es letztendlich darum, man hat eine Funktion, ob es jetzt wirklich als Funktion definiert wurde, ist eigentlich zweitrangig, die einen Eingabewert erhält und die einen Ausgabewert erhält. Und dabei ist es so, dass sie deterministisch ist, bedeutet, es muss immer, wenn ich einen Eingabewert A reingebe, Ausgabewert B rauskommen. Es darf keine interne Manipulation noch mal durch externe Quellen stattfinden. Zum Beispiel, angenommen, man hätte noch eine JSON-API, von der man sich Daten holen würde und würde die in dieser Funktion verarbeiten, dann wäre es kein Algorithmus mehr, weil man noch eine externe Quelle dazu beziehen würde.

{00:12:17}Leon sagt: Ich würde vielleicht noch weitere Fakten über Algorithmen hinzuwerfen. Das eine ist zum Beispiel, man dürfte keine wiedererbrüchliche Beschreibung haben, sie müssen mit endlich vielen Worten bzw. Zeichen beschrieben werden, man müsste endlich viele Schritte zur Terminierung haben, sowie dass man zu jeder Zeit weiß, was quasi der nächste Schritt des Algorithmuses ist und er sollte ausführbar sein.

{00:13:00}Felix sagt: Gut, die Ausführbarkeit setze ich mal bei einem Programm immer voraus.

{00:13:15}Felix sagt: Gut, Algorithmen kannst du auch unabhängig von Programmieren verwenden, das ist noch mal was anderes, aber in unserer Welt ist das ja eigentlich eine Selbstverständlichkeit, dass der Code auch ausführbar sein sollte. Zurück noch mal zu dem Thema endlich. Um das noch mal ein bisschen einfacher auszudrücken, es geht letztendlich darum, man muss halt davon ausgehen können, dass immer ein valider Ausgabewert zurückkommt von dieser Funktion des Algorithmuses. Dass es nicht sein darf, dass du zum Beispiel keinen validen Wert zurückbekommst, der nicht dem Schema entspricht. Wenn ich das jetzt vernünftig ausgedrückt habe hier, ich denke ja. Also als Beispiel können wir ja gerne mal die Fibonacci-Folge hernehmen.

{00:13:36}Leon sagt: Oh ja, dahinter steckt auch ein sehr toller Algorithmus.

{00:14:01}Felix sagt: Genau, gerade auch aus der Fotografie bekannt oder aus der Kunst durch den goldenen Schnitt oder halt auch eben aus der Natur, woher sich der goldenen Schnitt letztendlich auch ableitet, wodurch halt auch die Fibonacci-Folge daraus resultiert. Wobei die Fibonacci-Folge auch wiederum auf einem Algorithmus basiert, der diese beschreibt. Als Beispiel, es fängt bei 1 an als ersten Wert und 1 plus 1 addiert ist 2, 1 plus 2 ist 3, 2 plus 3 ist 5 und eben so weiter wird es gerechnet. Und wenn man jetzt als Beispiel das Ganze als Kacheln aufzeichnen würde, würde man halt genau beim goldenen Schnitt landen. Das ist ungefähr nicht ganz ein Drittelverhältnis, wobei das nicht ganz dem entspricht. Ist eine bisschen krummere Zahl, die habe ich jetzt nicht genau im Kopf. Und dieser Algorithmus kann man eben dann auch beim Programmieren anwenden. Beziehungsweise man könnte dann zum Beispiel eine Funktion machen, die einem die zehnte Stelle der Fibonacci-Folge berechnet. Oder du kannst halt einen Parameter übergeben, der dir sagt, welche Stelle berechnet werden soll. Zum Beispiel wenn du die zehnte Stelle haben willst, ist das 55 oder wenn du die zwanzigste Stelle haben willst, ist das 6765.

{00:15:36}Leon sagt: Respekt. Also um das nochmal kurz in so eine Formel zu packen, das wäre denn ja quasi F von n das gleich sowas wie F von n-1 plus F von n-2, dann hat man das ganz auch nochmal mathematisch zusammengefasst. Ich hoffe, das war richtig. Dürfte.

{00:15:33}Felix sagt: Genau. Okay für die Mathefreaks unter euch. Gut, ja die Fibonacci-Folge könnte man zum Beispiel sehr gut rekursiv abbilden oder programmieren. Da haben wir schon wieder ein neues Wort, rekursiv. Was bedeutet rekursiv?

{00:15:50}Leon sagt: Ja, rekrusiv ist ja irgendwie ein wiederholtes Aufrufen eines Algorithmuses mit einem Problem vom selbigen Typ. So würde ich das beschreiben.

{00:16:10}Felix sagt: Okay um das mal in etwas einfachen Worten auszudrücken. Eine Funktion, die sich selbst aufruft, solange bis sie auf sozusagen, ich beschreibe es immer als unterste Ebene angekommen ist. Ab der geht es dann wieder rauf, zurück die ganzen Ebenen, um dann ein Ergebnis daraus resultierend auszugeben. Bedeutet eine rekursive Funktion muss immer eine Abbruchbedingung haben, an der ein Ende definiert ist. Was jetzt zum Beispiel in dem Fall der Fibonacci-Folge die zehnte Stelle, also ein Zähler bis zehn sein könnte, der in der Rekursion mitgegeben wird.

{00:16:55}Leon sagt: Ja.

{00:17:05}Felix sagt: Alternativ könnte man dieses jetzt natürlich auch über einen Loop/Schleife umsetzen, wobei man dann halt je nachdem halt, es gibt halt häufig Situationen, wo man Konstrukte über eine Schleife abbilden kann und über eine Rekursion, wobei man es bei der Rekursion häufig einfacher hat, dadurch, dass man nicht noch Hilfsvariablen mitgeben muss, da man einfach die Parameter an eine Funktion übergeben kann, was ich persönlich meistens charmanter finde.

{00:17:25}Leon sagt: Man muss an der Stelle auch immer so ein bisschen gucken. Reklusive Funktionen sind nicht unbedingt immer einfacher zu lesen als,

{00:17:36}Felix sagt: Schleifen.

{00:17:53}Leon sagt: ja ich suche den Fachbegriff, egal. Als nicht-rekrusive Funktion.

{00:17:58}Felix sagt: Iterationen meinst du

{00:18:00}Leon sagt: Jawohl. Da kann man halt auch immer abwägen, hey ist mir gerade Lesbarkeit wichtiger oder die Kürze des Codes.

{00:18:10}Felix sagt: Ja, das ist auf jeden Fall auch immer eine Frage des Umfangs der Funktion, würde ich sagen, wenn man jetzt so ein drei bis vier Zeiler in einem Loop hätte oder wirklich bei einer Rekursion irgendwie mit, keine Ahnung, mir fällt gerade kein passendes Beispiel an, aber es gibt halt Fälle, wo einfach eine Schleife schöner ist, wenn es einfach nur darum geht zum Beispiel zwei Arrays nach einem bestimmten Verfahren, was man sich selbst festgelegt hat zu merchen, ist es vielleicht schön das Ganze in einer Schleife zu machen, weil es halt eigentlich eine sehr kurze Funktionalität ist oder dann hat man irgendwie was Komplexeres, wo mehrere Werte rekurrsiv eingeordnet werden müssen, zum Beispiel, was ich halt gerne als Beispiel nehme aus dem Bereich der Webseiten, wenn du eine Navigation bauen willst, die automatisch sich generiert, dann hast du ja häufig ein Listenelement, also eine UL mit LI Elementen da drin und dann hast du in diesem einzelnen LI Element, was noch weitere Unterpunkte hast, wieder eine UL drin und sowas bekommst du dann zum Beispiel als JSON Struktur, die deutlich komplexer ist und das musst du halt dann umformen in die entsprechende HTML Struktur. Dann finde ich es halt sehr schön, das Ganze über eine Rekursion zu lösen, weil bei einer Schleife bräuchtest du sehr viele Hilfsvariablen, um das wirklich sauber und schön hinzubekommen, finde ich.

{00:19:33}Leon sagt: Ich muss sagen, seitdem ich damals mit Erlang entwickelt habe, habe ich Rekusion viel besser verstanden, selber auch schreiben können. Man muss es halt einfach üben, um da Stück für Stück weiter reinzukommen. So zum Anfang ist es nicht...

{00:19:34}Felix sagt: Um das noch mal kurz aufzugreifen, Erlang war eine funktionale Programmiersprache, die hat dir dann geholfen, weil du mehr über Rekursionen machen musst, weil du keine Schleifen hast in Erlang, ist das so richtig?

{00:19:51}Leon sagt: Korrekt. Ja, ich bin mir gar nicht sicher, ob es die nicht vielleicht doch gegeben hat, aber zumindest hat man es eigentlich nicht genutzt.

{00:20:05}Felix sagt: Was haben wir noch für Algorithmen?

{00:20:23}Leon sagt: Ja, da gibt es ja eigentlich eine ganze Menge, was man darauf antworten könnte. Es gibt Sortier-Algorithmen, wie zum Beispiel Merge-Sort, Heap-Sort, Quick-Sort, Bubble-Sort, die eine Menge sortieren. Dann gibt es Dinge wie Greedy-Algorithmen, die die beste Lösung möglichst schnell erzielen. Es gibt Dinge wie Divide and Conquer, wo man ein großes Problem in mehrere kleinere Probleme zerteilt und diese dann vom Algorithmus lösen lässt und die zusammengetragenen Ergebnisse dann quasi kombiniert. Dann gibt es so was wie, ich denke, das hat jeder von uns schon gehört, Brute-Force-Algorithmen, mit der man systematisch das Testen aller Möglichkeiten betreibt, um dann quasi an ein Ziel zu kommen.

{00:21:06}Felix sagt: Ein schönes Beispiel dafür ist zum Beispiel auch ein Sudoku, das kann man sehr schön mit einem Brutforcing Algorithmus lösen. Es ist zwar langwierig, aber es ist halt so ein häufiger Fall, den Anfänger gerne über ein Brutforcing lieber lösen, als einen komplexeren Algorithmus dafür zu schreiben, zum Beispiel.

{00:21:11}Leon sagt: Man kann viele Sachen brute-forcen, man kann Passwörter bestimmt auch gut brute-forcen. Kommt drauf an, wo.

{00:21:36}Felix sagt: Hash Algorithmen oder dass die Hashes wieder in Klartext zu bekommen, ist halt so ein typischer Fall für Brutforcing.

{00:21:58}Leon sagt: Ansonsten gibt es zum Beispiel auch randomisierte Algorithmen, wo man mindestens einen Zufallswert braucht. Hashes beispielsweise. Mehr fällt mir dazu auch gerade spontan nicht ein.

{00:21:55}Felix sagt: Es war jetzt auf jeden Fall eine ganze Menge, aber die sich jetzt im Detail anzuschauen alle, wäre auf jeden Fall etwas zu viel für diese Episode.

{00:22:17}Leon sagt: Ja, ich denke mal, einfach mal einen kurzen Überblick darüber zu geben, ist vielleicht gar nicht verkehrt gewesen. Aber du wolltest dorthin gehen?

{00:22:27}Felix sagt: Deshalb gehen wir doch jetzt lieber zu dem Thema, ja, ich wollte dahin gehen, wie wird man da drin besser Algorithmen zu schreiben, beziehungsweise dieses algorithmische Denken, problemorientierte Denken von Ergebnissen, was man ja beim Programmieren auch immer hat. Wie kann man sich in dem ganzen Thema verbessern?

{00:22:36}Leon sagt: Also wir haben jetzt gerade ein paar Algorithmen genannt. Nachdem man sich dann einen entsprechenden Algorithmus rausgesucht hat und sich damit beschäftigt hat, wie der denn funktioniert, wofür er denn ist, kann man das Ganze beispielsweise in verschiedenen Programmiersprachen erstmal nachprogrammieren. Das Ganze kann man dann ganz gut kombinieren mit Test-Driven Development, das heißt, man schreibt, bevor man einen Algorithmus schreibt, Tests, die dann überprüfen, ob der Algorithmus, den man geschrieben hat, funktioniert, weil ein ständiges Austesten und Randfälle abtesten. Und so ist bei Algorithmen wie zum Beispiel solche Algorithmen oder so nicht unbedingt nervig, wenn man dann Randfälle behandeln möchte und jedes Mal auch noch abfragen muss. Genau, ansonsten gibt es noch Webseiten, aber da hast du dich, glaube ich, ein bisschen auseinandergesetzt. Felix, richtig?

{00:23:29}Felix sagt: Genau, es gibt halt einige sehr schöne Webseiten, die einem dabei helfen, gerade dieses algorithmische Denken, sage ich mal, und auch einfach auf Lösungen hinauszuarbeiten, die halt immer einen spezifischen Output geben, dabei helfen. Eine der bekanntesten und auch der ältesten, die ich persönlich kenne, ist Project Euler. Bei Project Euler geht es darum, mathematische Probleme zu lösen. Die können dann zum Beispiel lauten, als Beispiel, wenn wir alle natürlichen Zahlen unter 10 auflisten, die Vielfachen von 3 oder 5 sind, erhalten wir 3, 5, 6 und 9. Die Summe dieser Vielfachen ist 23. Finde die Summe aller Vielfachen von 3 oder 5 unter 1000. Das ist ja dann zum Beispiel so eine klassische Aufgabe. Das ist halt auch wiederum der Nachteil von Project Euler, finde ich. Project Euler ist halt auf jeden Fall an Personen gerichtet, die auch ein gutes mathematisches Verständnis haben, was nicht unbedingt notwendig ist, um gut programmieren zu können.

{00:24:48}Leon sagt: Ich finde, generell kann man an die Aufgaben von Project Euler auch verschieden herangehen. Man kann sie natürlich auch jeweils mit verschiedenen Codeansätzen lösen und das ist auch vielleicht kein verkehrter Ansatz, direkt mal einen Git-Repository damit zu füllen, damit man schon mal die ersten Referenzen gesammelt hat, wenn man gerade anfängt mit dem Programmieren.

{00:24:56}Felix sagt: Ja, auf jeden Fall. Das hatte ich am Anfang tatsächlich auch relativ viel gemacht, nur ich bin halt daran gescheitert, dass Mathematik einfach nicht so meine Stärke ist, bzw. ich kann es alles gut verstehen, wenn ich mich auch damit beschäftige, aber ich will mich meistens gar nicht so viel damit beschäftigen. Ich mag dann lieber Aufgaben, wo es halt darum geht, eher mehr Programmierrätsel zu lösen, sage ich mal, die halt jetzt nicht unbedingt darauf beruhen, achliche mathematische Begriffe zu kennen.

{00:25:45}Leon sagt: Advent of Code ist doch ein gutes Beispiel, oder?

{00:25:49}Felix sagt: Ja, Advent of Code ist ein sehr schönes Beispiel dafür. Ich weiß nicht, ob wir mal eins vorlesen können komplett. Die sind immer relativ lang geschrieben, muss man sagen. Ich nehme jetzt mal das erste von diesem Jahr.

{00:26:07}Leon sagt: Ich nehme ganz kurz vorweg, während du gerade am Suchen bist, Advent of Code ist beispielsweise ein jährlich stattfindendes Programmier-Event in der Adventszeit und man muss halt verschiedene Programmier-Puzzle dabei lösen. Die Aufgaben werden dann vom Veranstalter veröffentlicht und können in beliebigen Programmiersprachen gelöst werden. Ich weiß gar nicht, ob wir das dieses Jahr auch gemacht haben, aber HelloCoding hat normalerweise auch eine eigene Rangliste. Ist das noch aktuell?

{00:26:34}Felix sagt: Ja, dieses Jahr hat man das gar nicht mehr so gemacht, weil halt bei vielen das Interesse dieses Jahr nicht so hoch war und wir auch alle nicht so wirklich Zeit hatten.

{00:26:35}Leon sagt: Viele haben noch keine Zeit.

{00:26:44}Felix sagt: Das ist halt eher das Problem, da man sich halt für sowas auch häufig wirklich Zeit nehmen muss. Was noch wichtig ist, bei Advent of Code, die Rätsel sind immer auf Englisch formuliert, aber falls jetzt Englisch nicht eure Stärke sein sollte, könnt ihr euch die auch auf Deutsch übersetzen, weil sich jetzt auch der Einfachkeit halt über ... Wie bitte? Was hast du gesagt?

{00:26:46}Leon sagt: Am besten auch mit ChatGPT übersetzen lassen, das funktioniert auch super. Ja, ChatGPT kann Dinge auch gut übersetzen.

{00:27:05}Felix sagt: Ja? Ach stimmt, ja. Ich hatte tatsächlich mal getestet, ich hatte JSON-Objekte für ein Produkt, an dem ich arbeite, die ich halt übersetzen musste in verschiedensten Sprachen. Nur da hatte ich dann das Problem, das JSON war zu lang, ChatGPT hat dann nach einer Zeit abgebrochen. Dann habe ich gesagt, continue. Dann hat er auch weitergemacht, war auch syntaktisch richtig, aber der hat dann sich einfach neue Setzbegrifflichkeiten dazu ausgedacht, die in das JSON-Objekt reinpassen würden. Gut, aber zurück zum Thema Advent of Code. Die erste Aufgabe von diesem Jahr war zum Beispiel, die Rentiere des Weihnachtsmanns fressen normalerweise normales Rentierfutter, aber sie brauchen viel magische Energie, um an Weihnachten die Geschenke auszuliefern. Ihr Lieblingssnack ist daher eine besondere Sternfrucht, die nur tief im Dschungel wächst. Die Elfen haben dich auf ihrer jährlichen Expedition zu dem Hain mitgenommen, in dem die Frucht wächst. Um genügend magische Energie zu erhalten, muss die Expedition bis zum 25. Dezember mindestens 50 Sterne sammeln, obwohl die Elfen dir versichern, dass der Hain reich an Früchten ist, beschließt du vorsichtshalber, alle Früchte zu pflücken, die du unterwegs siehst. Sammelt Sterne durch das Lösen von Rätseln. An jedem Tag des Adventskalenders werden zwei Rätsel zur Verfügung gestellt. Das zweite Rätsel wird freigeschaltet, wenn du das erste gelöst hast. Für jedes Rätsel gibt es Sterne. Viel Glück! So, das war die allgemeine Aufgabenstellung für Advent of Code und jetzt kommt nochmal die spezifischere für eine einzelne Aufgabe dann, in dem Fall jetzt die erste. Der Dschungel muss zu überwuchert und schwierig sein, um ihn mit Fahrzeugen zu befahren oder aus der Luft zu erreichen. Die Expedition der Elfen geht traditionell zu Fuß, während sich eure Boote dem Land nähern. Beginnen die Elfen mit der Inventur ihrer Vorräte. Ein wichtiger Punkt ist dabei die Nahrung, insbesondere die Anzahl der Kalorien, die jeder Elf mit sich führt. Ihre Rätseleingabe. Die Elfen schreiben abwechselnd die Anzahl der Kalorien auf, die in den verschiedenen Mahlzeiten, Snacks, Rationen enthalten sind, die sie mitgebracht haben. Ein Gegenstand pro Zeile. Jeder Elf trennt seine eigenes Inventar vom Inventar des vorherigen Elfen, falls vorhanden, durch eine Lehrzeile. Angenommen, die Elfen schreiben die Kalorien, ihre Gegenstände auf und erhalten die folgende Liste. Jetzt haben wir eine Liste von fünf Einträgen und immer zum Beispiel 1000, 2000, 3000, Lehrstelle 4000, Lehrstelle 5000, 6000 und so weiter. Diese Liste stellt die Kalorien der Lebensmittel dar, die von fünf Elfen getragen werden. Der erste Elf trägt Lebensmittel mit 1000, 2000 und 3000 Kalorien, also insgesamt 6000 Kalorien. Der zweite 4000, der dritte 11000, der vierte 24000. Der fünfte Elf trägt ein Lebensmittel mit 10.000 Kalorien bei sich. Für den Fall, dass die Elfen hungrig werden und zusätzliche Snacks brauchen, müssen sie wissen, welche Elfe sie fragen müssen. Sie möchten wissen, wie viele Kalorien die Elfen mit den meisten Kalorien bei sich trägt. Im obigen Beispiel ist dies 24.000, getragen vom vierten Elf. Finde die Elfe mit den meisten Kalorien. Wie viele Kalorien trägt diese Elfe insgesamt? Und dann gibt es, das war jetzt die Aufgabe, und dann gibt es immer noch eine Textdatei mit einer Liste von Zahlen, in diesem Fall jetzt die Inventare der Elfen, aus der man diesen Wert jetzt berechnen muss, um den Elf mit dem größten Inventar zu finden. Genau, und so ist dann auch die weitere Aufgabe dann aufgebaut, dass man halt sehr schöne verpackte Rätsel hat, die man dann halt sehr schön programmatisch lösen muss, da es halt sehr viele Zahlen sind. Das kannst du händisch nicht berechnen, außer du hast viel Zeit und Langeweile.

{00:31:14}Leon sagt: Ja, aber das haben wir nicht. Hast du sonst noch Webseiten gefunden?

{00:31:25}Felix sagt: Genau, das ist jetzt so eine Adventsseite gewesen, und dann gibt es noch zwei andere Beispiele, die ich sehr schön finde. Das eine war Code Abby, das ich gerade für Anfänger im Programmieren hervorragend finde, da es sehr, sehr ähnlich zu Project Euler aufgebaut ist, allerdings von den Aufgabenstellung her einmal direkt auch andere Sprachen bietet, wie Deutsch unter anderem, was halt für Anfänger halt auch noch mal einfacher ist, da das halt auch je nachdem mal eine Einstiegshürde nochmal sein kann, und die sind halt mehr auf das Programmieren ausgerichtet. Zum Beispiel als Aufgabe war es jetzt hier. Als nächstes ist unser Ziel, Loops kennenzulernen, sprich Programmierschleifen. Also da geht es dann halt um Schleifen, und dann hat man eine Eingabe und eine zweite Zeile nochmal mit weiteren Werten, und dann muss man daraus die Lösung wiederum mit Schleifen berechnen, was halt dann mehr an den Programmierer nochmal gerichtet ist, der jetzt nicht so daran interessiert ist, sein mathematisches Verständnis auch auszubauen. Genau, ähnliche Seite, aber vom Design her und von der Eingabe dann ein wenig schöner gemacht LeetCode. Die haben auch zum Teil Preismodelle noch, also es ist nicht nur rein kostenfrei, alle anderen waren bisher immer komplett kostenfrei. Die haben sich dann halt noch etwas mehr Mühe gegeben, die haben dann sehr schöne Test Cases nochmal aufgeführt, die man testen kann, haben nochmal ein bisschen mehr Beispiele, das ist nochmal ein wenig feiner aufgeführt in vielen Punkten. So viel zu LeetCode. Du hattest noch eine Plattform?

{00:32:44}Leon sagt: Ja, und zwar habe ich auf codinggame.com, Clash of Code, im vergangenen Semester kennengelernt. Das ist eine Webseite, auf der man komparativ gegeneinander programmieren kann. Beispielsweise ist dort die Zeit, die man zum Programmieren eines Algorithmus benötigt oder auch die Zeilenlänge, halt verschiedene Metriken gefordert, um das Game zu gewinnen.

{00:33:37}Felix sagt: Ja, das stimmt. Und wie ich mich erinnere, habe ich nur dadurch gewonnen, dass ich weniger Lehrstellen als du verwendet hattest, aber eigentlich war dein Code so vom Ansatz her besser.

{00:33:44}Leon sagt: Ja, reden wir am besten nicht drüber, das wäre einfach noch frech.

{00:33:55}Felix sagt: Das ist halt manchmal so eine kleine Tricky Sache bei der Seite, einfach Lehrstellen rauskürzen, einfach keine Umbrüche machen und schon ein bisschen kürzer, also hast du gewonnen. Aber ich glaube, da hätten wir auch alle Seiten so erwähnt, die sehr spannend sind auf jeden Fall, um sich da weiterzuentwickeln. Gerade auch das Anschauen von bekannten Algorithmen macht halt extrem viel aus und das Ausprobieren und die Praxis davon ist halt ein sehr wichtiger Punkt, um sich bei diesen Themen weiterzuentwickeln. Gut, was noch ganz interessant ist, auf hellocoding.de, ich denke, wir kommen jetzt mal zum Ende, habe ich einen neuen Artikel veröffentlicht zu Mastodon und wie man die Feeds in die Webseite einbinden kann. Mastodon ist auch so ein Thema für sich, worüber wir sicherlich noch mal in einer Podcast Episode ausgiebig drüber sprechen können.

{00:34:44}Leon sagt: Ich habe mich damit tatsächlich noch gar nicht beschäftigt, also gerne.

{00:34:54}Felix sagt: Ja, ich habe da ein paar Gedanken und Konzepte im Kopf, aber das werden wir dann noch mal ausgiebig erörtern.

{00:35:01}Leon sagt: Ansonsten würde ich wie immer noch mal ganz kurz für unseren Hello Coding Discord Server werben. Wir haben jetzt gerade die normalen Frage-Channel durch Discord-Forum ersetzt. Ich bin mal echt gespannt, wie das Ganze ankommt. Zum jetzigen Zeitpunkt, zur Aufnahme des Podcasts, ist das Ganze noch relativ neu, aber auch die ersten Fragen sind in den Foren eingetroffen. Man kann in den Foren auch Unterkategorien auswählen, wie jetzt zum Beispiel SEO oder ich glaube, Künstliche Intelligenz war bestimmt auch, Neuronano-Netzte oder sowas in der Art war auch vorhanden. Also auch alles, was wir in den Podcasts besprechen, findet Platz in dem entsprechenden Foren.

{00:35:33}Felix sagt: Genau. Und sonst wär's das dann auch wieder gewesen. Bis zum nächsten Mal.

{00:35:54}Leon sagt: Bis dann!

Bildquelle - Vielen Dank an die Ersteller:innen für dieses Bild
Kommentare zur Podcast Episode {04}

Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zur Podcast Episode {04}!

Kommentar schreiben

Neue Podcast Episoden

close