Цикл продолжается после оператора возврата, как его остановить - PullRequest
0 голосов
/ 14 мая 2019

Функция next_c продолжает работать после достижения return True, а затем возвращает none позже.

Я поместил операторы печати повсюду, чтобы узнать, что работает.«Отметьте 1» в операторе if непосредственно перед печатью оператора return, тогда оператор else выполняется сразу после.Если я поставлю return True непосредственно перед оператором if if, я получу ожидаемые результаты для остальной части программы.

import numpy as np

A=[ ["I","L","A","W"],
  ["B","N","G","E"],
  ["I","U","A","O"],
  ["A","S","R","L"] ]



def next_c(atemp, x, y, word): #make a subarray from atemp and check to next c
    suba = atemp[x-1:x+2:,y-1:y+2:]
    for n in range(3):
        for m in range(3):
            if word[0] == suba[n][m]:
#here is the problem
                if len(word) == 1:
                    print("Check1")
                    return True
                else:
                    #change temp array char to 0 then get new sub array coords
                    atemp[x][y] = 0
                    x = x + n -1 
                    y = y + m -1
                    next_c(atemp, x, y, word[1:])


def look(atemp, word, size):#look for 1st c in temp array
    for x in range(size+1):
        for y in range(size+1):
            if atemp[x][y]==word[0]:
                atemp[x][y] = 0  #replace letter with a 0 
#this should return True but always gets None
                if next_c(atemp, x, y, word[1:]):
                    print("Check2")
                    return True

def find_word(board, word):
    a = np.array(board)
    a = np.pad(a, 1, "constant")
    if look(a, word, len(board)):
        return True
    return False

print(find_word(A, "BINGO")) #this should be True

После print('Check1') Я ожидаю, что возвращаемый параметр True перейдет к if next_c(atemp, x, y, word[1:]):, так что будет выполнено print('Check2'), за которым следует окончательный возврат True из find_word.

1 Ответ

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

Вы забыли проследить свою рекурсию. Попробуйте это для начала:

            if len(word) == 1:
                print("Check1")
                return True
            else:
                #change temp array char to 0 then get new sub array coords
                atemp[x][y] = 0
                x = x + n -1 
                y = y + m -1
                print("Check 2: before recur")
                next_c(atemp, x, y, word[1:])
                print("Check 3: after  recur")

Выход:

Check 2: before recur
Check 2: before recur
Check 2: before recur
Check1
Check 3: after  recur
Check 3: after  recur
Check 3: after  recur
Check 2: before recur
Check 3: after  recur
False

Проблема в том, что вы не можете вернуть любое логическое значение, кроме базового случая True. Вы нажимаете на точку «Check1» и возвращаете True, но затем следующий вызов стека игнорирует возвращаемое значение. Это означает, что для любого, кроме вырожденного случая, next_c возвращает None (возвращаемое значение по умолчанию), и это то, что возвращается обратно в look, а затем find_word. None является значением "falsey", поэтому find_word преобразует его в явный False, который получает основная программа.

Поместите необходимые return в этот рекурсивный вызов. Тогда мы получим:

Check 2: before recur
Check 2: before recur
Check 2: before recur
Check1
Check2
True

Обратите внимание, что программа больше не падает с конца самого внутреннего блока else - «Проверка 3» никогда не появляется, поскольку код возвращается только раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...