готовая предкоманда с возвратом в python

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

0
задан 30.11.2019, 22:52
1 ответ

Это достаточно 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à - не "загрязняют" выполнение одни с другими.

1
ответ дан 01.12.2019, 10:30

Теги

Похожие вопросы