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):])