递归函数的递归比它需要的还要多

时间:2017-05-04 00:33:33

标签: python recursion tree iteration huffman-code

我正在编写代码,用于为给定字母表中的符号序列生成霍夫曼代码。它通过构建霍夫曼节点树的算法来实现。每个节点或者具有来自该字母表的唯一符号并且是叶节点,或者其符号设置为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_sequence现在为空时继续?

以下是示例输出:

enter image description here

这是我在这个例子中使用的树的最佳表示:

   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)

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

这完全解决了这个问题,我无法理解......

0 个答案:

没有答案