Почему моя функция не заканчивается после возврата? - PullRequest
1 голос
/ 24 марта 2020

Я создаю дерево суффиксов, используя строку "BANANA $". При вызове моей функции findPath из main как "print (findPath (root," BANANA $ ", 5))", поэтому, проверяя, является ли "A $" путь из root, я получаю следующий вывод:

SEQUENCE: A$
  CUR CHILD: $
    NON-MATCH: $ 0
  CUR CHILD: A
    CHILD MATCHED: A
    NEW SEQ: $

SEQUENCE: $
  CUR CHILD: $
REACHED THE END!
  CUR CHILD: BANANA$
  CUR CHILD: NA
False

Она выводит строку «ДОСТИГНУТЬ КОНЕЦ!», Поэтому ясно, что функция коснулась этой части кода, но почему моя функция не завершает работу после строки «вернуть True»?

def findPath(curNode, sequence, i):

    sequence = sequence[i:]
    print("\nSEQUENCE: " + sequence)

    for child in curNode.children:
        print("  CUR CHILD:", child.val)
        # print(len(child.val), child.val)

        # NO WAY IT CAN BE A MATCH, SO SKIP
        if (len(child.val) > len(sequence)):
            pass

        # POSSIBILITY TO MATCH
        else:
            curInd = 0
            count = 0

            # CHECK IF child.val MATCHES THE BEGINNING OF sequence
            while (curInd < len(child.val)):
                if (child.val[curInd] != sequence[curInd]):
                    print("    NON-MATCH:", child.val[curInd], curInd)
                    count += 1

                curInd += 1

            # child.val MATCHES THE BEGINNING OF sequence
            if (count == 0):
                # AN EXACT MATCH, SO REACHED THE END
                if (child.val == sequence):
                    print("REACHED THE END!")
                    return True

                else:
                    print("    CHILD MATCHED:", child.val)
                    newInd = len(child.val)
                    sequence = sequence[newInd:]
                    print("    NEW SEQ:", sequence)
                    findPath(child, sequence, 0)
    return False

1 Ответ

1 голос
/ 24 марта 2020

После возврата из рекурсивного вызова родительская функция продолжает свою for loop. Если вы хотите, чтобы он остановился, когда дочерний процесс достиг конца, вам нужно проверить возвращаемое значение рекурсии.

                else:
                    print("    CHILD MATCHED:", child.val)
                    newInd = len(child.val)
                    sequence = sequence[newInd:]
                    print("    NEW SEQ:", sequence)
                    if findPath(child, sequence, 0):
                        return True

Это будет распространять значение True обратно через стек рекурсии.

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