2016-11-24 2 views
2

У меня есть рекурсивная функция с массивом в качестве параметра, который сохраняет путь при перемещении сетки от (0, 0) до (x, y), и я должен пропускаются некоторые пункты, которые определены как «недоступный»Python - понять область действия переменной pass на рекурсивную функцию

я осуществить свою функцию как этот

unAvailablePoint = [(1, 2), (3, 0), (0, 3), (2, 3), (0, 1)] 

def steppable(point): 
    return point not in unAvailablePoint 

def travel(x, y, path, visited): 
    if x >= 0 and y >= 0 and steppable((x, y)): 
     if (x, y) in visited: 
      return visited[(x, y)] 
     success = False 
     if (x, y) == (0, 0) or travel(x-1, y, path, visited) or travel(x, y-1, path, visited): 
      path = path + [(x, y)] #the path will remain empty even after the recursive call have done some changes to the path 
      success = True 
     visited[(x, y)] = success 
     return success 
    return False 

path = [] 
visited = {} 
travel(3, 3, path, visited) 
print(path) //[] 

Как я распечатать path в конце концов, это кажется path еще пуст. Это не то, что я ожидал как начинающий Python. Любое предложение было бы полезно

+0

Ну, ваша функция путешествия возвращает только 'True' /' False', поэтому изменения пути остаются в рамках этого этапа рекурсии. – Fejs

+0

В Java это различно, что позволяет вам изменять параметр, когда идет рекурсивный шаг. По мере того, как обратные треки, вызывающий должен иметь возможность получить обновленное значение для параметра, который переходит на рекурсивный шаг детей? –

ответ

3

Попробуйте добавить к пути и не инициализировать его каждый итерация рекурсии:

path.append((x,y)) #the path will remain empty even after the recursive call have done some changes to the path 

вместо:

path = path + [(x, y)] #the path will remain empty even after the recursive call have done some changes to the path 

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

+0

Это работает. Но почему мы будем повторно инициализировать список, поскольку мы используем 'путь = путь + [(x, y)]'? –

+1

Поскольку функция 'path = path + [(x, y)]' находится в функции, когда вы сделали это, вы сделали путь в качестве локальной переменной функцией перемещения. при использовании append вы убедитесь, что путь не инициализирован внутри функции, поэтому он не будет локальной переменной для функции. @KesongXie –

+1

Другое решение: 'path + = [(x, y)]' – MarianD