作为学校作业的一部分,我必须编写霍夫曼算法的代码,但我的变量之一有问题,我不明白为什么。
def encodedata(huffmanTree, dataIN):
"""
Encodes the input string to its binary string representation.
"""
binresult = ""
for i in dataIN:
tmp = _encodedata(huffmanTree, i, '') # NoneType ??
binresult = binresult + tmp
return binresult
def _encodedata(tree, char, val):
if tree.key == char:
return val # val is str
if tree.key == None:
_encodedata(tree.right, char, val + '1')
_encodedata(tree.left, char, val + '0')
在我的辅助函数中,val是一个字符串(必须使用type(val)),但在我的主要函数中,tmp的类型为“ NoneType”,而它应与val相同...
编辑: 我改变了整个功能,并且可以正常工作。这是我将提交的版本:
def encodedata(huffmanTree, dataIN):
"""
Encodes the input string to its binary string representation.
"""
result = ''
L = _encodedata(huffmanTree, '', [])
for i in dataIN:
for j in L:
if i == j[0]:
result = result + j[1]
return result
def _encodedata(tree, val, L):
if tree.key != None:
L.append((tree.key, val))
else:
_encodedata(tree.right, val + '1', L)
_encodedata(tree.left, val + '0', L)
return L
但是,我仍然感谢您解释为什么我以前的代码不起作用。谢谢您的帮助。
答案 0 :(得分:0)
您需要返回递归调用的结果:
def _encodedata(tree, char, val):
if tree.key == char:
return val # val is str
if tree.key == None:
return _encodedata(tree.right, char, val + '1')
return _encodedata(tree.left, char, val + '0')
不这样做,您可以在递归完成后隐式地在函数中返回None
。