我一直在試圖實現基於數字的霍夫曼編碼算法。我已經完成了構建霍夫曼樹的部分。但遞歸算法不能按預期工作。它應該返回樹中從根到指定節點的路徑,但它總是返回錯誤的路徑。Python使用遞歸找到樹的路徑
奇怪的是,代碼似乎在做什麼是正確的,它可以找到真正的路徑。但它返回的結果總是別的東西。
def get_encoding_for(symbol_p, node, encoding):
global encoded_string
result = encoding
if not isinstance(node, list):
if symbol_p == node:
encoded_string = result
return result
else:
for n in node:
index = str(node.index(n))
# print("Node {} with index {}".format(n, index))
result = get_encoding_for(symbol_p, n, encoding + index)
return result
該樹使用簡單列表進行結構化。
The huffman tree looks like: [[3.0, [1.0, 2.0]], [4.0, 5.0]]
這是使用元素1,2,3,4,5的簡單樹的輸出示例。
Loop 1.0. Node 1.0 -> Coding 010:
Loop 2.0. Node 2.0 -> Coding 011:
Loop 3.0. Node 3.0 -> Coding 00:
Loop 4.0. Node 4.0 -> Coding 10:
Loop 5.0. Node 5.0 -> Coding 11:
這就是我想要的函數返回,但它只在所有五次迭代中返回我「11」。我不得不使用全局變量來「截取」正確的編碼,我對此並不滿意......我認爲問題在於迴歸。我嘗試了很多返回的方法,但都沒有工作。
有人能告訴我遞歸有什麼問題嗎?非常感謝!
問題是你的遞歸在找到正確的路徑時並沒有結束,它只是繼續前進,直到遍歷樹中的每一條路徑。這就是爲什麼返回值總是「11」 - 這是你樹中的最終路徑。您需要添加一種機制來檢測您是否找到了您要搜索的元素,並停止節點:'循環中的n。 –
謝謝您的回覆,但爲什麼「返回結果」不會停止該方法? – LIn
你的'for'循環中沒有'return'。 'return'發生在循環之後,所以你得到_last_值,而不是正確的值。 –