Tema
/
Algoritmai ir duomenų struktūros GO
Pamoka 5 / 15 Rekursija ~50 min
Kodas

Tas pats apėjimas du kartus

Sukurk walk.go (žr. dešinėje). Jame yra Folder, du apėjimai ir du medžio kūrimo pagalbininkai.

Perskaityk abu apėjimus greta. WalkRecursive — keturios eilutės. WalkIterative — dešimt, ir aštuonios iš jų tvarko stack slice.

Tos aštuonios eilutės yra tai, ką rekursijoje už tave atlieka vykdymo aplinka.

Vienas dalykas, kurį lengva praleisti

// Vaikus dedam atvirkštine tvarka, kad nuimant jie eitų originalia.
for i := len(f.Subs) - 1; i >= 0; i-- {
    stack = append(stack, f.Subs[i])
}

Stekas yra „paskutinis įėjo, pirmas išėjo". Jei sudėtum vaikus iš eilės, jie išeitų atbulai. Rekursijoje šito nematyti, nes tvarką nustato ciklo eiliškumas.

Kai stekas tampa tavo, tvarka tampa tavo atsakomybe. Tai kaina — ir kartu galimybė: 14 pamokoje pakeisi steką eile ir gausi visai kitą apėjimo tvarką.

Rezultatas

$ algo walk -depth 3 -branch 3 -per 2
tree: depth=3 branch=3 items-per-folder=2

walk                          items folders visited
recursive                        80             40
iterative (your stack)           80             40

identical — same algorithm, different place to keep the stack

Tie patys 80 įrašų, tie patys 40 aplankų. Ne panašiai — tiksliai.

Tai ir yra pamokos esmė: rekursija ir ciklas su steku yra du to paties algoritmo užrašymo būdai. Ne du algoritmai.