Diskuze: Rekurze v Javě při řešení Hanojských věží
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.


A co na tom nechápeš? Však ti dokonce popisuje tu cestu dole těmi
čárkami. Na rekurzi je skvělé používat debugger - tam krásně vidíš, co
ti to provádí.
Ty máš na vstupu tedy hodnoty v tomto pořadí - A C B
Když ti projde rekurze do první konečné větve, tak ti to přehodí A s C
(takže pořadí máš najednou C A B
Pak přejde do druhé větve a prohodí A s B (takže pořadí je najednou C B
A)
No a tak dále.
Kdysi dávno jsem tu popisoval v jednom komentáři rekurzi. Snad ti to pomůže k pochopení (docela jsem se v ní rozepsal:) )
Třída Pismeno, která představuje jedno písmenko + dvě, které se od něj větví binární soustavou (něco jako by "Pismeno a" byla matka a "Pismeno b" byl otec "Pismena":)
public class Pismeno {
private final Pismeno a;
private final Pismeno b;
private final String nazev;
public Pismeno(String nazev, Pismeno a, Pismeno b) {
this.a = a;
this.b = b;
this.nazev = nazev;
}
public String getNazev(){
return nazev;
}
public Pismeno getA() {
return a;
}
public Pismeno getB() {
return b;
}
}
Třída PismenaVBinarniSoustave, která představuje rekurzivní test stejný jako je v třetím příkladu:
public class PismenaVBinarniSoustave{
private final Pismeno k = new Pismeno("k", null, null);
private final Pismeno j = new Pismeno("j", null, null);
private final Pismeno i = new Pismeno("i", null, null);
private final Pismeno h = new Pismeno("h", null, null);
private final Pismeno g = new Pismeno("g", null, null);
private final Pismeno f = new Pismeno("f", null, k);
private final Pismeno e = new Pismeno("e", i, j);
private final Pismeno d = new Pismeno("d", h, null);
private final Pismeno c = new Pismeno("c", f, g);
private final Pismeno b = new Pismeno("b", d, e);
private final Pismeno a = new Pismeno("a", b, c);
public PismenaVBinarniSoustave() {
rekurze(a);
}
public static void main(String[] args) {
new PismenaVBinarniSoustave();
}
private void rekurze(Pismeno p) {
if (p != null) {
System.out.println(p.toString().toUpperCase());
System.out.println(" 1:" + p.getA());
System.out.println(" 2:" + p.getB());
rekurze(p.getA());
System.out.println("*******");
rekurze(p.getB());
}
}
}
/**Postup
* Půjde nám o takovýto strom:
* H - I J - K - - H = potomek D I a J = potomci E G nemá žádné potomky
* \ / \ / \ / \ /
* D E F G D a E = potomci B F a G = potomci C
* \ / \ /
* \ / \ /
* B C B a C = potomci A
* \ /
* \ /
* \ /
* \ /
* A A = Hlavní předek
*
* Nejdřív zadáme do rekurze Pismeno A (tím myslím instanci třídy Pismeno, ne skutečné písmeno)
* Proběhne první rekurze (rekurze Áčka):
* A není null, takže podmínka platí a spustí se první řádek, který dělá novou rekurzi - rekurzi Pismene B:
* B není null, takže podmínka platí a spustí se první řádek, který dělá novou rekurzi - rekurzi Pismene D:
* D není null, takže podmínka platí a spustí se první řádek, který dělá novou rekurzi - rekurzi Pismene H:
* H není null, takže podmínka platí a spustí se první řádek, který dělá novou rekurzi - rekurzi prvního null:
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je první větev rekurze H, takže se pokračuje dál ve druhé větvi
* druhá větev H je null
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je druhá větev rekurze H, takže Háčko končí
* druhá větev D je null
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je druhá větev rekurze D, takže Déčko končí
* druhá větev B je E
* E není null, takže podmínka platí a spustí se první řádek, který dělá novou rekurzi - rekurzi Pismene I:
* I není null, takže podmínka platí a spustí se první řádek, který dělá novou rekurzi - rekurzi prvního null:
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je první větev rekurze I, takže se pokračuje dál ve druhé větvi
* druhá větev I je null
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je druhá větev řekurze I, takže Íčko končí
* Druhá větev E je J
* J není null, takže podmínka platí a spustí se první řádek, který dělá novou rekurzi - rekurzi prvního null:
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je první větev rekurze J, takže se pokračuje dál ve druhé větvi
* druhá větev J je null
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je druhá větev řekurze J, takže Jéčko končí
* Jelikož E už třetí větev nemá, tak končí i Éčko
* Jelikož B už třetí větev nemá, tak končí i Béčko
* druhá větev A je C
* C není null, takže podmínka platí a spustí se první řádek, který dělá novou rekurzi - rekurzi Pismene F:
* F není null, takže podmínka platí a spustí se první řádek, který dělá novou rekurzi - rekurzi prvního null:
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je první větev rekurze F, takže se pokračuje dál ve druhé větvi
* druhá větev F je K
* K není null, takže podmínka platí a spustí se první řádek, který dělá novou rekurzi - rekurzi prvního null:
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je první větev rekurze K, takže se pokračuje dál ve druhé větvi
* druhá větev K je null
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je druhá větev řekurze K, takže Jéčko končí
* Jelikož F už třetí větev nemá, tak končí i eFko
* druhá větev C je G
* G není null, takže podmínka platí a spustí se první řádek, který dělá novou rekurzi - rekurzi prvního null:
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je první větev rekurze G, takže se pokračuje dál ve druhé větvi
* druhá větev G je null
* null je null, takže podmínka neprojde a žádná rekurze nevznikne. Toto je druhá větev řekurze G, takže Géčko končí
* Jelikož C už třetí větev nemá, tak končí i Céčko
* Jelikož A už třetí větev nemá, tak končí i Áčko
*
* Když půjdete řádek po řádku a zakreslovat si správně vazby, měl by vám vyjít tento obrázek:
*
* null null null null null null null null
* \ / \ / \ / \ /
* \ / \ / \ / \ /
* \ / \ / \ / \ /
* H null I J null K null null
* \ / \ / \ / \ /
* \ / \ / \ / \ /
* \ / \ / \ / \ /
* \ / \ / \ / \ /
* D E F G
* \ / \ /
* \ / \ /
* \ / \ /
* \ / \ /
* \ / \ /
* \ / \ /
* \ / \ /
* \ / \ /
* B C
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* \ /
* A
*/
jip123:18.4.2021 17:34
Moc děkuji za odpovědi. Pomohly.
Zobrazeno 4 zpráv z 4.