
Python a využití rekurze
Zdar borci, mám jednoduchý úkol. Používám python 3.6 a za úkol máme seznam seznamů seznamů... a rekurzivě máme vypsat všechny prvky z tohoto seznamu. Bohužel nevím, jak na to.
Mám funkci, která mi vypíše postupně seznamy (result_all), ale při rekurzivním volání funkce se mi to samozřejmě přepíše na prázdný seznam a posléze se nově zaplňují hodnoty.
def recursive_count(nested_num_list):
result_all = [] # globalni promenna
if len(nested_num_list) != 0:
for elem in range(len(nested_num_list)):
#print(nested_num_list, nested_num_list[elem], elem) # kontrola
if type(nested_num_list[elem]) == type([]):
#print(nested_num_list, elem) # kontrola
recursive_count(nested_num_list[elem])
else:
result_all.append(nested_num_list[elem])
print('vysledek:', result_all)
return result_all
print(recursive_count([2, 9, [2, 1, 13, 2], 8, [2, 6]]))
#recursive_count([[9, [7, 1, 13, 2], 8], [7, 6]])
#recursive_count([[9, [7, 1, 13, 2], 8], [2, 6]])
print(recursive_count([[5, [5, [1, 5], 5], 5], [5, 6]]))
Při tomto programu vyjde takovýto výsledek, přičemž result vypíše vždy jen poslední seznam.
vysledek: [2, 1, 13, 2]
vysledek: [2, 6]
vysledek: [2, 9, 8]
[2, 9, 8] // toto je result
vysledek: [1, 5]
vysledek: [5, 5]
vysledek: [5, 5]
vysledek: [5, 6]
vysledek: []
[] // toto je result
Nevíte prosím, kde mám chybu a jak to udělat, aby mi result vypsal všechny prvky ze seznamů? Díky moc.
Sám sis přece odpověděl:
Tak to nedělej.
Problém je, že proměnnou musím prvně inicializovat a když to neudělám, pak se mi třeba všechna testovací volání skloubí do 1 seznamu, a to taky nechci. Proto když to odeberu, budu stále v háji, jen někde jinde.
No ale nemusíš to přece inicializovat uvnitř funkce.
A nebo lépe, pokud bys to chtěl mít jako "pure" funkci, tak z toho udělej lokální proměnnou.
Hmm, když z toho udělám globální proměnnou, tak se mi to pak spojí do jednoho seznamu všechno. Ovšem když ji pokaždé inicializuji na prázdný seznam před každým voláním, tak to funguje, ale přijde mi to hrozné znásilňování. Musí být lepší způsob.
výsledek:
No však jsem ti napsal i lepší variantu.
V Pythonu nedělám, ale zkusil jsem něco takového:
A jo, dvě vnořené funkce do sebe. Thx.