Ошибка от простой инициализации переменной?

Собирая решатель 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] 
Другие вопросы по тегам