Zřejmě vás mate to, že v debuggeru nevidíte, v kterém volání té funkce jste. Pomůže, když se v debuggeru podíváte na zásobník volání – call stack. Tam uvidíte, jak se vnořujete do volání té funkce a zase vynořujete.
Pokud se během toho posunu dostanu například na hranici nebo na jinou barvu pozadí tak je podmínka v ifu false a celý blok je přeskočen (krokování v debugeru), ale po tom neskončí jak bych očekával ale hned se vrátí zpět a pokračuje další metodou seedFill(x-1,y).
Ono provádění té metody skončí. Ale provádění se tudíž vrátí do místa, odkud byla ta metoda vyvolána. A to místo je shodou okolností zase ta metoda
seedFill, ale v předchozí iteraci – právě proto že je to rekurzivní volání.
Tedy vy zavoláte poprvé
seedFill. Podmínka se vyhodnotí jak pravdivá, skočí se dovnitř bloku. Následně se zavolá
raster.setPixel – zapamatuje se aktuální místo v programu, skočí se do metody
setPixel a ta se provádí. Když se dojde na konec metody
setPixel, skočí se na zapamatované místo – tedy zpět do prvního volání metody
seedFill. Pokračuje se sál, tam je (rekurzivní) volání
seedFill – takže se opět zapamatuje aktuální místo a skočí se do metody
seedFill – teď už je to druhé zanořené volání. V debuggeru to bude vypadat, že jste najednou skočil na začátek té metody
seedFill, ale v zásobníku volání už ta metoda bude dvakrát. Provádí se druhé volání
seedFill, v nějakém okamžiku se ukončí a provádění se vrací zpět na zapamatované místo – což je to první volání
seedFill. To je to, co vám v debuggeru připadá, jako by byl začátek té metody přeskočen. Ve skutečnosti to ale znamená, že jste se jen vrátil do dříve spuštěné metody a pokračujete tam, kde jste prve skončil. Uvidíte to na zásobníku volání, kde v tu chvíli bude už jenom jedna metoda
seedFill – jste zpět v tom prvním volání metody.
Mimochodem, používat na tuhle úlohu rekurzi není moc vhodné. Zásobník volání má omezenou kapacitu, u větších obrázků byste ji překročil.