@asadob1: Das da findet gar keine Flüsse, nicht mal Teile von Flüsse. Schau Dir mal die Ausgabe an wenn garantiert *gar kein* Fluss in `a` enthalten ist:
Code: Alles auswählen
In [98]: a = [
...: [0, 0, 0, 0, 0],
...: [0, 0, 0, 0, 0],
...: [0, 0, 0, 0, 0],
...: [0, 0, 0, 0, 0],
...: [0, 0, 0, 0, 0],
...: ]
...: print(a)
...: for i in a:
...: for j in a:
...: if i == j:
...: print("fluss")
...:
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
fluss
``for``- oder ``while``-Schleife ist nicht primär eine Frage der Geschwindigkeit, sondern welche im gegebenen Fall sinnvoller ist. ``for``-Schleifen verwendet man, wenn man über eine Folge von Elementen von irgendwas iteriert was man entweder schon hat, oder sich leicht erstellen kann. ``while``-Schleifen wenn man eine sinnvolle Abbruchbedingung formulieren kann, oder sich erst *im* Schleifenkörper entscheidet ob man fertig ist und die Schleife abbrechen kann, oder nicht.
Die Aufgabe erfordert mehr als eine Schleife und die müssen auch nicht alle vom gleichen Typ sein, wenn man an einigen Stellen etwas hat über das man iterieren kann und an anderen Stellen etwas solange wiederholen möchte, bis eine bestimmte Bedingung eingetreten ist.
Es wurde ja schon gesagt, dass das keine ganz triviale Aufgabe ist. Aber ganz so komplex ist sie halt auch nicht. Man braucht für eine relativ unkomplizierte Lösung beispielsweise keine Rekursion, sondern kann das mit ein paar Schleifen machen. Also ohne das man sich Rekursion mit einem eigenen Stapel nachprogrammiert oder ähnlich komplex. Ich habe das mit einer Lösung in CBM BASIC ja gezeigt, dass das bei den gegebenen Vorbedingungen mit sehr primitiven Mitteln überschaubar machbar ist.
Von der Komplexität her ist das aber schon so umfangreich, dass ich, insbesondere einem Anfänger, dringend dazu rate das in kleinere Teilprobleme zu zerlegen, und nicht zu versuchen das alles in *ein* tief verschachteltes Schleifenkonstrukt zu schreiben. Die BASIC-Lösung verwendet letztlich drei Schleifenebenen um die Flusslängen zu ermitteln, und das ist auf das Hauptprogramm und zwei Unterprogramme verteilt. Wobei man in Python vielleicht den einen Zeilenblock mit den vier nahezu identischen Inhalten vielleicht auch noch mit einer Schleife ausdrücken würde. Und ich würde da auch mehr als zwei Funktionen schreiben. Also klar, die Unterprogramme in dem BASIC-Programm wären heisse Kandidaten für eigene Funktionen in Python, aber auch das was dort drin gemacht wird, lässt sich noch sinnvoll zerlegen. Der Vorteil ist, dass man damit Codestücken einen Namen geben kann, der beschreibt, was der Code im Kontext der Problemlösung macht. Gerade als Anfänger ist es IMHO gut eher zu viele Funktionen zu definieren und lesbaren und damit verständlichen Code damit zu schreiben. Wenn man fertig ist, kann man die immer noch ”inlinen”. Das ist einfach. Schwieriger ist dagegen bei zu umfangreichem/komplexen/nicht mehr überschaubaren Code anzufangen Teile in Funktionen heraus zu ziehen. Dabei muss man deutlich mehr nachdenken und dabei können deshalb auch mehr Fehler passieren.
Möglicher Grundablauf beim Programmieren ganz allgemein: Problem in Teilprobleme zerlegen. Teilprobleme in kleinere Teilprobleme zerlegen. Solange wiederholen bis man Teilprobleme hat, die sich mit einer Funktion mit wenigen Zeilen Code lösen lassen. Diese Funktion erst testen, ob sie tatsächlich das macht was sie soll bevor man zur nächsten Teillösung/Funktion weitergeht. Es nützt nichts auf ungetesteten oder gar nachweislich nicht funktionierenden Funktionen aufzubauen. Aus funktionierenden Teillösungen lassen sich dann grössere Teillösungen zusammenbauen, bis man am Ende das Gesamtproblem gelöst hat.
Das ganze Schritt für Schritt *entwickeln*. Also nicht alles runterschreiben und *dann* erst das erste mal ausführen, sondern immer mal wieder schauen wie weit das was man hat, der Lösung näher kommt.
Vor alledem musst Du aber erst einmal einen Algorithmus überlegen. In der Regel ohne Rechner, mit Stift und Papier überlegen und an Beispielen durchspielen, wie man das grundsätzlich Lösen und diese Lösung in einer vollständigen und präzisen schriftlichen Anleitung erklären kann. Jemandem der nicht sehr schlau ist, und der sich alles notieren muss, weil er es sonst vergisst. Denn mit dem Programm musst Du das letztlich noch formaler und präziser jemandem beibringen der ultimativ dumm ist und kein Stück selbst denkt: dem Rechner.