Python рекурсия не возвращает значение - PullRequest
3 голосов
/ 14 мая 2011

По какой-то причине x в этом коде не обновляется в рамках рекурсии.Разве х не должен обновляться, так как я звоню b (c) внутри a (y)?Когда x обновляется в b (c), но не возвращается к

global nested
def extract(nested,depth):
    y = depth[0]
    depth = depth[1:]
    extract = nested[y]
    newlist(extract)
    return depth
def newlist(x):
    nested = x
    return nested
def recursiveRef(nested,depth):
    """Return element from nested list
    list ->int
    """
    if len(depth) == 0:
        return nested
    else:
        return recursiveRef(nested,extract(nested,depth))

Ответы [ 5 ]

3 голосов
/ 14 мая 2011

Это то, что вы пытаетесь сделать?

def recursiveRef(nested,depth):
    """Return element from nested list
    list ->int
    """
    if len(depth) == 0:
        return nested
    else:
        return recursiveRef(nested[depth[0]],depth[1:])

print recursiveRef([[1,2,3],[4,[5,6],7]],[1])
print recursiveRef([[1,2,3],[4,[5,6],7]],[1,1])
print recursiveRef([[1,2,3],[4,[5,6],7]],[1,1,1])

Вывод

[4, [5, 6], 7]
[5, 6]
6
1 голос
/ 14 мая 2011

Ваш код выглядит подозрительно. Когда вы думаете, что хотите глобальную переменную, обычно вам нужен класс. Попробуйте обернуть свои функции в класс и использовать self.x вместо x.

Тем не менее, «глобальный» не должен быть написан в верхней части вашей программы. Вместо этого он нужен в каждой функции, которая изменяет вашу глобальную переменную, но не в тех, которые только читают ее.

def newlist(x):
    global nested
    nested = x
    return nested
1 голос
/ 14 мая 2011

Я не мастер Python, но я думаю, что проблема в том, что x локально для функции рекурсии.Вы меняете другой глобальный x в своем b(c).Пожалуйста, поправьте меня, если я ошибаюсь.

0 голосов
/ 14 мая 2011

Еще более простая нерекурсивная версия:

def inTree(tree, ref):
    for offs in ref:
        tree = tree[offs]
    return tree
0 голосов
/ 14 мая 2011

Переменная x в функции b не привязана к переменной в recursion.

Я действительно не понимаю, что вы пытаетесь сделать - я могу бытьнеправильно, но я предлагаю вам рассмотреть возможность поместить две функции a и b в recursion, создав замыкание .Таким образом, вложенные функции могут видеть и изменять все переменные, определенные во внешней области видимости.

...