2017-02-22 78 views
4

我想寫一個算法來執行霍夫曼解碼。我在Scala中完成它 - 這是Coursera課程的一個任務,我不想違反榮譽代碼,所以下面是僞代碼而不是Scala。霍夫曼解碼(斯卡拉)

我寫的算法需要樹tree和位列表bits,並且應該返回消息。但是,當我在提供的樹上嘗試它時,我得到一個NoSuchElementException(空列表的頭)。我看不出爲什麼。

我知道我的代碼可以整理一下 - 我對函數式編程還是很新的,所以我用一種對我來說很有意義的方式編寫代碼,而不是以最緊湊的方式編寫代碼。

def decode(tree, bits) [returns a list of chars]: { 

    def dc(aTree, someBits, charList) [returns a list of chars]: { 

     if aTree is a leaf: 

      if someBits is empty: return char(leaf) + charList 
      else: dc(aTree, someBits, char(leaf) + charList) 

     else aTree is a fork: 

      if someBits.head is 0: dc(leftFork, someBits.tail, charList) 
      else someBits is 1: dc(rightFork, someBits.tail, charList) 
     } 

    dc(tree, bits, [empty list]) 

    } 

在此先感謝您的幫助。這是我第一次在StackOverflow上,所以我可能有一些學習如何最好地使用該網站。

回答

3

如果我理解正確,你想通過分叉(從位的方向),直到你會找到一片葉子。然後,您將爲您的char列表添加葉值,並從這一點開始您要重複步驟。 如果我是對的,那麼你應該把原始樹傳遞給你的幫助方法,而不是現在是葉的leftForkrightFork。 所以它會是這樣的:

if aTree is a leaf: 
    if someBits is empty: return char(leaf) + charList 
    else: dc(tree, someBits, char(leaf) + charList) 
+0

太棒了!謝謝。這正是問題所在。在我的腦海中,屏幕上出現錯誤。 – gadje

+0

我很高興能幫上忙。你可以批准一個答案嗎? :P – Rumid

+0

哈,是的,對不起,新的。 – gadje