Ошибка от простой инициализации переменной?
Собирая решатель Boggle, я столкнулся с каким-то странным поведением, которое, я надеялся, кто-нибудь мне объяснит. Я получил функцию для возврата набора возможных слов, и все, чего мне не хватало, - это способ предотвратить включение решателем слов, которые были созданы при посещении одного и того же квадрата дважды в пьесе. Я попытался создать список уже посещенных квадратов в текущей игре (список номеров индексов в строке, представляющей доску), перебирая глобальную переменную seen
(Я знаю, что это не будет правильно), который используется для запоминания ранее исследованных путей. Однако, просто инициализируйте переменную с этими значениями, используя:
previous_ind = [j for (pre, j) in seen]
в пределах рекурсивной функции find_bwords
как-то влияет на индексную переменную i
и вызывает IndexErrors, вытекающий из последней строки в find_bwords.
seen = set() #(prefix, index) pairs
def boggle_words(board, minlength=3):
"Find all the words on this Boggle board; return as a set of words."
results = set()
for i, sq in enumerate(board):
if is_letter(sq):
find_bwords(board, sq, i, results, minlength)
return results
def find_bwords(board, pre, start, results, minlength): #adds to seen and results
global seen
#prev_ind = [j for (pre, j) in seen] <---mystery culprit
if (pre, start) not in seen:
seen.add((pre, start))
if len(pre) >= minlength and pre in WORDS:
results.add(pre)
if pre in PREFIXES:
for i in neighbors(start, int(sqrt(len(board)))):
#print 'index: ', i
find_bwords(board, pre+board[i], i, results, minlength)
Вот часть распечатки индексов перед введением prev_ind
:
index: 0
index: 1
index: 2
index: 6
index: 8
index: 12
index: 13
index: 14
index: 1
index: 2
и вот часть после:
index: 0
index: -7
index: -14
index: -21
index: -28
index: -35
index: -42
Почему это происходит?
Чтобы было ясно, я не ищу решение этой задачи, я решил ее по-другому, я просто хочу понять, что происходит в этом случае.
1 ответ
Проблема в этой линии, которую вы назначаете pre
перезаписывая предыдущее значение:
prev_ind = [j for (pre, j) in seen] # <---mystery culprit
Попробуйте изменить это на это, и оно должно работать так, как вы ожидаете:
prev_ind = [j for (pre2, j) in seen]