Poglejmo si še eno nalogo, pri kateri nastopa rekurzija.
Izračunaj vsoto vseh števil v danem seznamu.
Recimo, da je dan seznam sez = [2,3,5,6,1]
. Radi bi sešteli vse njegove elemente.
Problema ne bo težko rešiti brez rekurzije.
def vsota(sez):
vsota = 0
for i in sez:
vsota = vsota + i
return vsota
>>> vsota([2,3,5,6,1])
17
>>>
Kako pa bi se zadeve lotili z rekurzijo?
Vsoto vseh danih števil iz seznama lahko dobimo tako, da najprej seštejemo prvi dve števili z enega konca seznama, tej vsoti prištejemo naslednje število v seznamu in tako naprej. Tako k skupni vsoti prištejemo števila celotnega seznama. Vsaka naslednja vsota predstavlja seštevanje dveh sosednjih števil kot smo to naredili na začetku.
Algoritem lahko ponazorimo z oklepaji
Vidimo, da je notranji oklepaj oz. enostavna operacija, rešljiva brez zanke. Prvotni korak, ki nas privede do rešitve enostavnega problema, ponavljamo vse do konca seznama, dokler nam ne ostane ena sama vrednost, ki predstavlja vsoto vseh števil. To je naš zaustavitveni pogoj.
Kakšno kodo nam narekuje dani algoritem?
Ideja: Vsota števil v seznamu je vsota prvega števila in seštevka števil v preostanku seznama.
Rekurzija:
vsota(seznam) = prvoStevilo(seznam) + vsota(preostanek(seznam))
Koda:
def vsota(seznam):
if len(seznam) == 1:
return seznam[0]
else:
return seznam[0] + vsota(seznam[1:])
Na prejšnjo stran Naprej