arbol1=[2,[7,[2,[],[]],[6,[5,[],[]],[11,[],[]]]],[5,[],[9,[4,[],[]],[]]]]
arbol2=[8,[3,[1,[],[]],[6,[4,[],[]],[7,[],[]]]],[10,[],[14,[13,[],[]],[]]]]
def raizArbin(a):
return a[0]
def izqArbin(a):
return a[1]
def derArbin(a):
return a[2]
def vacioArbin(a):
return a == []
def preordenLista(arbin,lista=[]):
if not vacioArbin(arbin):
x=raizArbin(arbin)
lista.append(x)
preordenLista(izqArbin(arbin))
preordenLista(derArbin(arbin))
return lista
def preordenLista2(arbin,lista=[]):
if not vacioArbin(arbin):
x=raizArbin(arbin)
lista.append(x)
preordenLista(izqArbin(arbin))
preordenLista(derArbin(arbin))
return lista
lista1=preordenLista(arbol1)
print lista1
lista2=preordenLista(arbol2)
print lista2
у меня есть следующий код, который теоретически был бы должен показывать список с предпорядком деревьев 1 и 2, но выполнив однажды все пойди нормально и он показывает мне список [2, 7, 2, 6, 5, 11, 5, 9, 4], который является предпорядком первого дерева, но во властвовать в функцию arbol2 он показывает мне [2, 7, 2, 6, 5, 11, 5, 9, 4, 8, 3, 1, 6, 4, 7, 10, 14, 13], не из-за того, что agrgan те дерева 1 в дерево 2
Это достаточно dif¦-cil объяснения, но причина estÃ: в назначенном по умолчанию аргументе, который ты дал funci¦n:
def preordenLista(arbin,lista=[]):
Заканчивается, что этот список, что ты распределяешь []
, - всегда тот же самый, всеми призывами к funci¦n. Поэтому ты можешь накапливать в ней, хотя ты не переместишь ее как parÃ: метр. Но это подразумевает, что у второго раза, который ты призываешь к funci¦n список aún, есть стоимость предыдущего ejecuci¦n. Чтобы это понимать сформируйся в идею, которой этот список vac¦ - в es вид глобальной переменной.
Восток немного неожиданное поведение показывается fÃ: cilmente, например as¦-:
>>> def ejemplo(elemento, lista=[]):
... lista.append(elemento)
... return lista
>>> ejemplo(1)
[1]
>>> ejemplo(2)
[1, 2]
mÃ: s прямой ser¦,, - который не должен не давать стандартную настройку этому списку, а перемещать это как parÃ: метр во всех вызовах:
def preordenLista(arbin,lista):
if not vacioArbin(arbin):
x=raizArbin(arbin)
lista.append(x)
preordenLista(izqArbin(arbin), lista)
preordenLista(derArbin(arbin), lista)
return lista
и естественно список vac¦ - в pasar¦-схвати в первом вызове, с главной программы:
lista1=preordenLista(arbol1, [])
print lista1
lista2=preordenLista(arbol2, [])
print lista2
, Если ты хочешь избежать быть должным перемещать список vac¦ - в с главной программы, так как я допускаю, что API остается "уродливой", ты можешь использовать следующий прием в перекурсивном funci¦n:
def preordenLista(arbin,lista=None):
if lista is None:
lista = []
if not vacioArbin(arbin):
x=raizArbin(arbin)
lista.append(x)
preordenLista(izqArbin(arbin), lista)
preordenLista(derArbin(arbin), lista)
return lista
Таким образом ты можешь не перемещать второй parÃ: метр, назвав ее, и crearÃ: список vac¦ - в. Так как этот список создается внутри funci¦n, serÃ: новость каждый раз, когда funci¦n был призван без второго parÃ: метр, и asà - не "загрязняют" выполнение одни с другими.