2014-12-11 128 views
0

我在Python中编码Huffman树。我有一个常规函数,它接受要编码的字符串和霍夫曼树。它创建一个字符串字符数组和一个空的数组,其条目将是每个char对应的二进制路径。该函数遍历字符串数组中的每个字符,调用函数2,递归搜索树,建立二进制代码并在找到字母后返回。通过树正确的递归函数移动,查找和打印的正确路径 -将递归函数赋值给python中的变量

一切工作正常。唯一的问题是,当我将该返回值赋给函数1中的变量并将其附加到二进制数组时,它将变为None。你能不能把递归的return语句分配给像这样的变量?任何帮助将不胜感激,因为我觉得我正在完成这一点的风口浪尖。

这里是我的代码:

 
def huffmanEncoder(s, t): 
    """encodes string s with Tree t""" 
    s = list(s) 
    b = [] 
    for i in range(len(s)): 
     val = recursiveHuff(t, '', s[i]) 
     print 'val:', val 
     b.append(val) 
    print b 

def recursiveHuff(tree, path, char): 
    """given a tree, an empty string 'path', and a character, 
    finds said char in tree and returns the binary path""" 
    print 'looking for:\t', char, 'path:\t', path 
    if not isLeaf(tree): 

     recursiveHuff(getLeftChild(tree), path+'0', char) 
     recursiveHuff(getRightChild(tree), path+'1', char) 
    else: 
     n = getNodeValue(tree) 
     if n[1] == char: 
      print 'found', char, 'at', path 
      return path 

回答

2

你的问题是,当你做你的递归步骤recursiveHuff没有返回值。你想积累路径并将其返回。正如您现在所做的那样,您对路径所做的更改对于递归调用是本地的。 (所以他们向下传播链,你下降,但不备份为你放松)

+0

OK - 所以最后2行recursiveHuff的'if'声明应该是*回报* recursiveHuff(....)?做出改变后,算法只能进入3级深度,只有在碰到这三个级别时才能找到路径... – wkd 2014-12-11 03:17:20

+0

有关如何解决此问题的任何建议?我感到难过。 – wkd 2014-12-11 03:30:13

+0

那么,你需要找出哪个分支有你正在寻找的角色。如果它是左分支,则返回该路径。如果它不在左边,你必须向右边探索。 (所以你不能立即返回左边的路径) – 2014-12-11 03:46:12