Zu kompliziertes Denken?

2 Antworten

1) Strukturierte Vorgehensweise

Viele Anfänger (damit sind generell die gemeint, die nicht strukturiert vorgehen) stürzen sich bei Aufgaben gleich an die Tastatur und übergehen dabei den Analyseteil, weil sie meinen, sie könnten dies während der Umsetzungsphase on the fly durchführen. Auch wenn sie eine ungefähre Lösung im Kopf haben, ist das kein Grund, direkt auf die Tastatur einzuhacken, denn dieses ungefähr hat meist noch verschiedene Fallstricke (nicht bedachte Anwendungsfälle, u.ä.).

Also: Erst das Problem formulieren / beschreiben (z.B. die Anforderungen) und aufteilen / in Teilpakete zerlegen. Die Gedanken sollten geordnet werden. Wenn der Lösungsweg bekannt und durchdacht ist, kann man in die Umsetzungsphase übergehen.

Möglicherweise kannst du dies etwas mit dem Matheunterricht aus der Schulzeit vergleichen, wo bei Sachaufgaben gern die Methodik gelehrt wird, zunächst zu ermitteln, was gegeben und was gesucht ist.

2) Hilfstools verwenden

Damit sind Skizzen, Pseudocode, diverse Diagramme (UML-Diagramme, Struktogramm, Programmablaufplan, ...) gemeint. Diagramme geben dir z.T. Grundbausteine vor, sodass du dich auch etwas eingrenzen musst.

Gestalte dir also Probleme und Lösungen visuell. Behalte es nicht nur im Kopf. Einiges kann man sogar tatkräftig nachstellen. Zum Beispiel Such- und Sortierverfahren mit Hilfe eines Kartenspiels.

3) Mit Dokumentationen arbeiten

Möglicherweise muss auch das geübt werden. Jedenfalls fällt es mir (gerade hier) öfter auf, dass viele mit Dokumentationen überhaupt nicht umzugehen wissen. Niemand verlangt, irgendwelche Referenzen auswendig zu können. Doch bei einem Problem mit einer Bibliothek z.B. ins FAQ zu schauen oder einfach mal zu recherchieren, ob es bereits implementierte (Teil-)Lösungen gibt, sollte kein Problem bereiten. Der ernsthafte Versuch allein zählt und kann selbst wenn man nicht fündig wurde, bei neuen Problemen die Recherchezeit verkürzen (weil man bei vorherigen Recherchen schon auf entsprechende Informationen gestoßen ist, o.ä.).

Neben den erwähnten Dokumentationen gibt es öfter ebenso fertige Third-Party-Tools, die Probleme bereits lösen und somit nur noch in das eigene Projekt eingebunden werden müssen. Solche findet man plump und einfach via Google.

4) Üben

Es gibt etliche Aufgaben, mit denen man üben kann, Algorithmen zu erstellen, indem man das vorliegende Problem formuliert, analysiert und zerlegt. Vor allem Aufgaben mit Rekursion eignen sich ziemlich gut, da sie auf dem Prinzip Teile und herrsche aufbauen.

Ein paar Beispiele (nicht nach Schwierigkeit geordnet):

  • Un-/Gerade Zahlen ermitteln
  • Prüfen, ob eine Zahl eine Primzahl darstellt
  • Multiplikation mit Addition lösen
  • Berechnung der Quersumme
  • Swap (zwei Elemente in einem Array austauschen)
  • Array vergrößern
  • n-te Stelle der Fibonacci-Folge bestimmen (iterativ)
  • n-te Stelle der Fibonacci-Folge bestimmen (rekursiv)
  • Wort rückwärts ausgeben (rekursiv)
  • Palindrom erkennen (rekursiv)
  • Berechnung von Zahlen im Pascal'schen Dreieck (rekursiv)
  • Wörter ohne Vokal erkennen (rekursiv; praktisches Beispiel: Sylt)
  • Soundex (phonetische Suche)
  • Caesar-Verschlüsselung
  • Verschlüsselung nach Vigenère-Verfahren
  • Nim-Spiel
  • Türme von Hanoi
  • Rucksackproblem
  • Conways Game Of Life
  • Boggle Board (welche Wörter es gibt, ist bereits in einer Liste vorgegeben)
  • Zahlen raten (Nutzer gibt eine Zahl zwischen 0 und 9999 vor, Computer soll die Zahl in möglichst wenigen Schritten erraten, darf aber immer nur nach Größer/Kleiner fragen)
  • Jump Search in einer Liste
  • Binäre Suche in einer sortierten Liste
  • Floyd's cycle-finding algorithm
  • Sortierverfahren von Listen (Bubblesort, Insertionsort, Selectionsort, Quicksort, Mergesort)
  • Das bekannte Flussüberquerungsrätsel (Bauer möchte mit Wolf, Kohlkopf und Schaf über einen Fluss, doch es können nur zwei Objekte gleichzeitig auf die Fähre; nur als Denkaufgabe)
  • Eine eigene Liste erstellen (Listen bestehen aus aneinaderliegenden Knoten, also wie bei einer Kette, die aus Kettengliedern besteht), und diese mit verschiedenen Funktionen ausstatten (Einfügen/Entfernen/Kopieren/Austauschen von Knoten)
  • Eine zirkuläre Liste erstellen und diese mit verschiedenen Funktionen ausstatten (Einfügen/Entfernen/Kopieren/Ausgeben von Knoten)
  • Einen eigenen Stack erstellen
  • Eine eigene Queue erstellen
  • Eine binäre Baumstruktur erstellen und für die ein Feature entwickeln, um zu erkennen, ob ein Baum in einem anderen Baum enthalten ist
  • Einen AVL-Baum erstellen sowie Funktionen, um über dessen Knoten zu traversieren
  • Zeichenketten bearbeiten (rückwärts ausgeben, in Teile zerlegen (nach Länge oder anhand bestimmter Zeichen), Länge ermitteln)
  • Die Anzahl an Buchstaben in einem Text bestimmen (Bsp: Hallo = 1x h, 1x a, 2x l, 1x o)
  • Den kleinsten Wert in einer Liste finden
  • Die längste Sequenz an gleichen Zahlen in einer Liste finden
  • Die längste absteigende Sequenz in einer Liste finden
  • Kürzesten Weg berechnen, um zwei Wörter anzugleichen (nur durch das Einfügen/Entfernen/Ersetzen von Wörtern)
  • Prüfen, ob ein Subset in einer Liste existiert, dessen Summe den gleichen Wert wie eine unabhängig gestellte Zahl ergeben kann (Bsp.: { 1, 8, 7, 4 } und 5 > { 1, 5 })
  • Eigenen Graph implementieren (bestehend aus Vertices und Edges) und für den den Dijkstra-Algorithmus, den Floyd Warshall sowie zwei Suchverfahren (BFS, DFS) entwickeln

Ebenso könntest du Pläne zu erdachter Software erstellen (Anforderungen definieren, Aufteilung des Programms in Objekte mit Zuständen und Methoden, Programmablauf der Methoden beschreiben):

  • Rechner-Tool (Grundrechenarten, Umrechnungen zwischen Zahlensystemen)
  • Ein simpler Rechner für Grundrechenarten (mit maximal noch Klammern für die Rechenreihenfolge), bei dem die Aufgaben geparst werden (heißt, die Eingabe könnte: 8-3*2 lauten und müsste so zunächst als Zeichenkette behandlet werden)
  • Ein XML-Parser (die zu parsenden Daten bestehen aus maximal 5-6 Elementtypen)
  • Textkomprimierung via Huffman-Kodierung
  • Spiele: Schach, Tetris, Mühle, Peg Solitaire

Ob du diese Aufgaben auch explizit mit irgendeiner Programmiersprache im Format eines Programms löst oder nicht, ist dir überlassen.

Möglicherweise helfen dir auch noch die Tipps weiter, die ich in diesen älteren Fragen gegeben habe:

Um die Gedanken zu beruhigen ist das klassische Mittel die Meditation.

Meditation ist auch gut um mehr Konzentration zu bekommen und sich einem Flow-Zustand anzunähern.

Das geht leider nicht von heute auf morgen, sondern man muss täglich üben, etwa wie beim Skateboardfahrenlernen.

https://ich-will-meditieren.de/meditationstechniken/samatha/