Python-da rekursiýa
Programmirlemede şeýle bir düşünje bar, rekursiýa - funksiýanyň özüni özüni çagyrmagy.
Mysal . Sanyjy bilen ýönekeý rekursiýa
Rekursiýa arkaly 1-den 10-a
çenli sanlary çap edeliň:
i = 1
def func():
global i
print(i)
i += 1
if i <= 10:
func() # bu ýerde funksiýa özüni özi çagyryar
func()
Geliň, bu kodyň nädip işleýändigini görüşeliň.
Bizde global üýtgeýjän i
we func funksiýasy bar, onuň içinde
konsola i üýtgeýjäniniň mazmuny
çap edilýär, soňra oňa
birlik goşulýar.
Eger bizim i üýtgeýjänimiz 10-dan kiçi ýa-da
deň bolsa, onda funksiýa
gaýtadan çagyrylýar. i üýtgeýjäniň
globaldygyna görä, her bir täze funksiýa çagyrylanda
onda öňki çagyryşda
berlen i üýtgeýjäniniň bahasy bolýar.
Netijede, funksiýa i bolýança
özüni özi çagyrmagy dowam etdirer 10-dan uly bolýança.
Üns beriň, bizim mysalda funksiýany
if sözsüz işledip bolmaýar - eger etseňiz,
onda çäksiz funksiýa çagyrmalary bolup geçer.
Mysal . Bürnük sanaw elementlerini çap etmek üçin rekursiýa
Rekursiýalar köplenç dürli derejeli bürnük sanawlary sanamak üçin ulanylýar. Bizde aşakdaky sanaw bolsun:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Geliň ony sanap geçýän funksiýa dözdüreliň.
Onda ilki bilen şert bermeli,
element primitiw bolsa,
ýagny sanawdan alnan ýönekeý san,
konsola çap edilmeli.
Eger element ýitileşdirilen
obyekt bolsa, meselem, bürnük sanaw bolsa, onda
bu ýagdaýda funksiýa özüni özi
çagyrmaly, ýagny rekursiýa ýüze çykmaly. Elementiň
görnüşini barlamak üçin isinstance funksiýasyny ulanarys.
Diňe bizim mysalymyz üçin isinstance-niň ilki parametrine
el ýazarys, ikinjisine bolsa
list görnüşini:
def func(lst):
for el in lst:
if isinstance(el, list):
func(el)
else:
print(el)
Funksiýa çagyrylanda bürnük sanawdaky ähli sanlaryň hatary çap ediler:
func(lst) # 1, 2, ... 8, 9 çap eder
Mysal . Bürnük sanaw elementleri bilen amallar üçin rekursiýa
Rekursiýany bürnük sanawlaryň elementleri bilen dürli amallar üçin hem ulanyp bolýar. Bizde aşakdaky sanaw bolsun:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Geliň onuň ähli elementleriniň jemini alalyň.
Munuň üçin funksiýada res üýtgeýjänini yglan edeliň,
oňa sanlaryň jemi ýygnalar.
Şertde ýazalyň, eger element
ýitileşdirilen obýekt bolsa, onda ol
func funksiýasynyň parametrine düşýär we jeme
goşulýar. Bu diýmek, element
primitiv bolýança rekursiýada
galar. Bu ýagdaýda ol diňe
res-da ýazylan jeme goşular:
def func(lst):
res = 0
for el in lst:
if isinstance(el, list):
res += func(el)
else:
res += el
return res
Geliň funksiýany çagyrýalyň we onuň netijesini konsola çap edeliň:
print(func(lst)) # 45 çap eder
Mysal . Sanawda ýygnamak üçin rekursiýa
Rekursiýa kömegi bilen bürnük sanawlary bir ölçegli sanawa ýazyp bolýar. Bizde aşakdaky sanaw bolsun:
lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]
Geliň funksiýada boş sanaw
res ýazalyň, oňa başlangyç sanawyň elementleri
ýygnalar. Soňra sikli işledeliň we şert belläliň - eger element
sanaw bolsa, onda ol extend metoda
düşer. Bu metod bir sanawyň elementlerini ikinji
sanawyň ahyryna birikdirýär,
ýagny bürnük sanawyň elementleri
res sanawyň ahyryna düşer:
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))
Ýerine ýetirilen kodyň netijesi:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Amaly meseleler
Iňlik derejesi hökmany bolmadyk sözlügiň ähli san elementlerini çap ediň:
{
'a': {
'b': 1,
'c': 2,
'd': {
'e': 3,
'f': 4
}
},
'j': {
'h': 5,
'k': 6,
},
'l': 7
}
Öňki mesele sözlüginiň elementleriniň jemini tapyň.
Öňki mesele sözlüginiň primitiw elementleriniň sanawyny alyň.