Flood Fill Algorithmus-Python
So, ich bin versuchen, um eine flood fill-Algorithmus, und ich erhalte eine Rekursion Fehler mit diesem. Der Algorithmus scheint zu einer unendlichen Rekursion, und ich kann nicht feststellen, warum. Ich habe überall gesucht im internet und ich finde keine Lösung wie es scheint, wie mein Programm richtig ist nach Ansicht der meisten Quellen. Es scheint etwas falsch zu sein jedoch. Dies ist die bearbeitete version des Codes. Die Fehlermeldung ist immer noch maximal rekursionen.
Bekomme ich Hilfe?
from Tkinter import *
from PIL import Image, ImageTk
from random import *
w= 75
h= w
flood = Image.new("RGB", (w,h), (0,0,0))
x = 0
y = 0
count = 0
colorlist = []
i = 0
while x < w -1:
y = 0
while y < h-1:
r = random()
if r < .25:
flood.putpixel((x,y), (0,0,0))
else:
flood.putpixel((x,y), (255,255,255))
y += 1
x += 1
x = 0
y = 0
while x < w-1:
y = 0
while y < h-1:
r = random()
if x == 0 or y == 0 or x == w-1 or y ==h-1:
flood.putpixel((x,y), (0,0,0))
y += 1
x += 1
def floodfill(x,y, d,e,f, g,h,i, image, count):
count+=1
(a,b,c) = image.getpixel((x,y))
if (a,b,c) == (255,255,255):
(j,k,l) = image.getpixel((x-1,y))
(m,n,o) = image.getpixel((x+1, y))
(p,q,r) = image.getpixel((x,y-1))
(s,t,u) = image.getpixel((x,y+1))
if count > 990:
return
if (a,b,c) == (255,255,255):
image.putpixel((x,y), (g,h,i))
floodfill(x-1, y, d,e,f, g,h,i, image, count)
floodfill(x+1, y, d,e,f, g,h,i, image, count)
floodfill(x, y-1, d,e,f, g,h,i, image, count)
floodfill(x, y+1, d,e,f, g,h,i, image,count)
floodfill(2,2, 0,0,0,255,0,0,flood, 0)
flood.save("flood.png")
print "done"
- Bitte geben Sie die genaue Fehlermeldung, die Sie sehen.
- Absturz mit Laufzeitfehler: maximale Rekursionstiefe überschritten, solange der Aufruf einer Python-Objekt
- Sie scheinen nicht zu werden, die überprüfung für x,y wird out-of-bounds - dazu führen könnte, dass eine unendliche Rekursion als x schnell geht Links. Oder erhoffen Sie sich für Ihre Grenzen zu sorgen?
- Python hat eine relativ niedrige Grenze für Rekursion, um die 1000 - dies ist ein Python-Falle für jemanden verwendet, um funktionale Sprachen mit tail-Rekursion Optimierungen wie Schema.
- Okay, so fügte ich ein paar mehr Grenzen und es nun nicht gehen out of bounds. Es funktioniert für kleinere Bilder, aber wenn Sie erhöhen Sie die Größe des Bildes, es erhöht die Anzahl der rekursionen, die wiederum bewirkt, dass die maximale Reichweite.
- Der bearbeitete code wird nun bis.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python hat eine Tendenz zu werfen
maximum recursion depth exceeded
Fehler, auch wenn der Algorithmus nicht recurse unendlich und würde schließlich den halt auf seinen eigenen. Es gibt zwei Lösungen: erhöhen Sie die Rekursion begrenzen, oder wechseln Sie zu einem iterativen Algorithmus.Können Sie erhöhen Ihr Rekursion Grenze mit
sys.setrecursionlimit
. Wählen Sie eine Nummer höher als die worst-case-Rekursionstiefe des Algorithmus. In deinem Fall wäre die Anzahl der Pixel im Bild,length * height
.Ändern Ihren Algorithmus in einen iterativen eines ist ziemlich einfach, da ist es eigentlich egal, in welcher Reihenfolge Sie die Farbe der Pixel, so lange, wie Sie Sie bekommen alle mindestens einmal. Ein
set
ist sehr gut geeignet, um zu halten die einzigartige nicht-geordnete Daten, verwenden wir also, dass zum speichern der Pixel, die wir brauchen, um zu malen.Wenn Sie verwenden den iterative Methode, sicher sein, setzen Sie gebunden Check-in es. Sonst könnte es laufen, für immer! Oder zumindest, bis Ihre Festplatte ist gefüllt von einem riesigen
toFill
gesetzt.Statt Rekursion, warum nicht Flut-füllen Sie eine Tiefe-zuerst Art und Weise? Rekursion verwendet eine implizite stack sowieso Sie haben also nichts zu verlieren.
Und ja, wie schon in den Kommentaren, sollten Sie prüfen, für x und y außerhalb der Grenzen.
Wurde dies nicht getestet, sondern basiert größtenteils aus dem code, den Sie zur Verfügung gestellt. Es sollte funktionieren und stellt eine alternative Methode zur Umsetzung der
floodfill
Algorithmus. Die Funktion könnte effizienter sein.