Rekursiya Python-da
Proqramlasdirmeda rekursiya anlayisi var - bu zaman funksiya ozunu cagirir.
Misal . Saygac ile sadə rekursiya
Gelin rekursiya vasitesi ile 1-den 10-a qeder reqemleri
cek edek:
i = 1
def func():
global i
print(i)
i += 1
if i <= 10:
func() # burada funksiya ozunu cagirir
func()
Gelin bu kodun necə işlediyini mueyyen edek.
Bizim qlobal deyişen i
ve func funksiyasi var, onun daxilinde
i deyişeninin deyeri konsola
cek edilir ve sonra ona bir vahid
elave olunur.
Eger bizim i deyişenimiz 10-dan kicik ve ya
beraber olarsa, onda funksiya yeniden
cagirilir. i deyişeni qlobal
olduğu üçün her yeni funksiya cagrisinda
onda evvelki cagrıda teyin olunmuş
i deyeri olacaq.
Beləlikle, funksiya i
10-dan boyuk olana qeder ozunu
cagirmağa davam edecek.
Nezere alin ki, bizim veziyyetde funksiyani
if olmadan işe salmaq olmaz - eks halda
sonsuz funksiya cagrisi alınar.
Misal . Ice salinmiş siyahilarin elementlerini cek etmek üçün rekursiya
Rekursiyalar en cox muxtelif derinlikdeki siyahilari neqrib etmek üçün tetbiq olunur. Tutaq ki, bizim asagidaki siyahimiz var:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Gelin onu neqrib edecek funksiya yaradaq.
Onda evvelce element primitiv olarsa,
yeni siyahiden cixarilan sadə reqem olarsa,
konsola cekilsin. Ve eger element murekkeb
obyektdirse, meselen, ice salinmiş siyahidirse, onda
bu veziyyetde funksiya ozunu cagirsin,
yeni rekursiya bas versin. Elementin tipini
yoxlamaq üçün isinstance funksiyasini tetbiq edek.
Yalnız bizim misal üçün isinstance-in birinci parametrinde
el yazaq, ikincisinde isə - list tipi:
def func(lst):
for el in lst:
if isinstance(el, list):
func(el)
else:
print(el)
Funksiyani cagirdiqda ice salinmiş siyahinin butun reqemleri sira ile cekilecek:
func(lst) # 1, 2, ... 8, 9 cekedecek
Misal . Ice salinmiş siyahilarin elementleri ile emeliyyatlar üçün rekursiya
Rekursiyalari ice salinmiş siyahilarin elementleri ile muxtelif emeliyyatlar üçün de tetbiq etmek olar. Tutaq ki, bizim asagidaki siyahimiz var:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Gelin onun butun elementlerinin cemin alaq.
Bunun üçün funksiyada res deyişenini teyin edek,
ona reqemlerin cemi yığılacaq.
Serte yazaq ki, eger element
murekkeb obyektdirse, onda o
func funksiyasinin parametrinde olacaq
ve ceme elave olunacaq.
Bu o demekdir ki, element
primitiv olana qeder rekursiyada
qalacaq. Ve bu veziyyetde o sadəcə
res-de yazılan ceme elave olunacaq:
def func(lst):
res = 0
for el in lst:
if isinstance(el, list):
res += func(el)
else:
res += el
return res
Gelin funksiyani cagiraq ve onun neticesini konsola cekek:
print(func(lst)) # 45 cekedecek
Misal . Siyahida yığmaq üçün rekursiya
Rekursiya vasitesi ile ice salinmiş siyahilari bir bir olculu siyahida aça bilerik. Tutaq ki, bizim asagidaki siyahimiz var:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Gelin funksiyada bos siyahi
res teyin edek,
ona ilkin siyahinin elementleri yığılacaq.
Daha sonra dövru işe salaq ve serte - eger element
siyahidirse, onda o extend metoduna düşsün.
Bu metod bir siyahinin elementlerini ikinci
siyahinin sonuna birleşdirir,
yeni ice salinmiş siyahinin elementleri
res siyahisinin sonuna düşecek:
def func(lst):
res = []
for el in lst:
if isinstance(el, list):
res.extend(func(el))
else:
res.append(el)
return res
print(func(lst))
Yerine yetirilmiş kodun neticesi:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Praktiki meseler
Ixtiyari derinlikdeki lugetin butun reqemsal elementlerini cek edin:
{
'a': {
'b': 1,
'c': 2,
'd': {
'e': 3,
'f': 4
}
},
'j': {
'h': 5,
'k': 6,
},
'l': 7
}
Evvelki meselenin lugetinin elementlerinin cemi tapın.
Evvelki meselenin lugetinin primitiv elementlerinin siyahisini alın.