【问题标题】:Why is my function not terminating after return?为什么我的函数在返回后没有终止?
【发布时间】:2020-07-04 15:11:33
【问题描述】:

我正在使用字符串“BANANA$”创建一个后缀树。当从 main 调用我的 findPath 函数为“print(findPath(root, “BANANA$”, 5))”,因此检查“A$”是否是来自根的路径时,我得到以下输出:

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

它打印出“REACHED THE END!”行,很明显该函数已经触及了代码的那部分,但是为什么我的函数没有在“return 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

【问题讨论】:

  • 函数是递归的。所以递归调用返回后,调用者继续。
  • 谢谢。我添加了一个最初设置为 False 的全局变量,而不是在我的函数中“返回 True”,而是将变量设置为 True,然后返回变量而不是“返回 False”

标签: python function return terminate suffix


【解决方案1】:

从递归调用返回后,父函数继续其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 值。

【讨论】:

    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多