Python 递归函数的递归比它需要的要远

Python 递归函数的递归比它需要的要远,python,recursion,tree,iteration,huffman-code,Python,Recursion,Tree,Iteration,Huffman Code,我正在编写代码,为给定字母表中的符号序列生成哈夫曼代码。它通过一个构建节点哈夫曼树的算法来实现这一点。每个节点都有来自此字母表的唯一符号,并且是叶节点,或者将其符号设置为None,并且是父节点。所有节点都有一个表示从根到它的路径的代码 我现在尝试编写一个函数,通过执行以下操作对编码的符号序列进行解码: 将初始解码序列设置为“” 递归地遍历树的每个级别,从根开始 在每个叶节点检查该节点的代码是否等于编码序列的第一个x字符-x是当前节点上该代码的长度 如果它们相等,则将此符号附加到解码序列,并从编

我正在编写代码,为给定字母表中的符号序列生成哈夫曼代码。它通过一个构建节点哈夫曼树的算法来实现这一点。每个节点都有来自此字母表的唯一符号,并且是叶节点,或者将其符号设置为
None
,并且是父节点。所有节点都有一个表示从根到它的路径的代码

我现在尝试编写一个函数,通过执行以下操作对编码的符号序列进行解码:

  • 将初始解码序列设置为
    “”
  • 递归地遍历树的每个级别,从根开始
  • 在每个叶节点检查该节点的代码是否等于编码序列的第一个
    x
    字符-
    x
    是当前节点上该代码的长度
  • 如果它们相等,则将此符号附加到解码序列,并从编码字符串中删除这些前
    x
    字符
  • 从树的根开始递归搜索编码字符串的新的第一个
    x
    字符
  • 在每个父节点上通过其子节点继续递归搜索
以下是我尝试递归搜索的代码:

def decode(root, current, coded_sequence):    # Initially called as decode(root, root, coded_sequence)
    decoded_sequence = ""
    for child in current.children:
        if child.symbol and child.code == coded_sequence[:len(child.code)]:
            decoded_sequence += child.symbol
            coded_sequence = coded_sequence[len(child.code):]    # Remove this matching code from the beginning of the coded sequence
            decoded_sequence += decode(root, root, coded_sequence)
        if child.children:
            decoded_sequence += decode(root, child, coded_sequence) # Go back to the root of the tree with the new shortened coded_sequence
    return decoded_sequence
我的算法是有效的,
decoded_sequence
在开头有正确的解码序列,但后面是解码序列结尾的部分,我不知道为什么。为什么我的函数从我认为
coded\u序列
现在将是空的开始继续

以下是一个示例输出:

下面是我对本例中使用的树的最佳表示:

   Root
 0/  1|
X6  None
 0/  1|
X5  None
 0/  1|
X4  None
 0/  1|
X3  None
 0/  1|
X2   X1
解决方案

我想如果我换衣服会更干净

coded_sequence = coded_sequence[len(child.code):]
decoded_sequence += decode(root, root, coded_sequence)


这完全解决了我无法解决的问题…

请阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。看起来,算法可以将相同的
coded_序列
传递到下一个子搜索,在相同的迭代中,它返回到根并重新开始。使用
elif child尝试。children:
而不是
if
?@c。。似乎仍然与那次变化相同或相似,unfortunately@KOB您的解决方案更改了算法,以便将
coded\u序列
而不是
coded\u序列[len(child.code):]
传递到
if child.children:decoded\u sequence+=decode(root,child,coded\u sequence)
@c。。很好,我现在知道怎么回事了。
decoded_sequence += decode(root, root, coded_sequence[len(child.code):])