haskell - 递归时如何存储树? (霍夫曼解码)

标签 haskell huffman-code

我正在尝试学习 Haskell。我正在尝试实现哈夫曼树。我的解码函数的参数是(基本上是“签名”):

decode :: HTree -> [Int] -> [Char]

因此,给定树和数字列表,我想返回解码后的消息。假设a = 01b = 1c = 001d = 000

当我可以使用两棵树进行解码时,我知道该怎么做。即:

decode :: HTree -> HTree -> [Int] -> [Char]

简单地说,保持第一棵树为原始树,并根据[Int]中的下一个数字使另一棵树向左或向右移动(如果是0,则向左移动,如果是1、向右走)。重复此操作,直到到达一个叶子,然后将叶子添加到[Char]列表中并继续使用递归。然而,我试图只用一棵树来做到这一点,即:

decode :: HTree -> [Int] -> [Char]

但是当我遍历它寻找叶子时,我不知道如何存储原始的HTree。我有办法在 Haskell 中做到这一点吗?

最佳答案

只需编写一个可以访问原始树的递归辅助函数:

decode :: HTree -> [Int] -> [Char]
decode orig = go orig
  where go :: HTree -> [Int] -> [Char]
        go curr = -- use both orig and curr here

关于haskell - 递归时如何存储树? (霍夫曼解码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60179523/

相关文章:

python - 将霍夫曼编码字符串转换为二进制

algorithm - 霍夫曼编码的实际应用是什么?

haskell - 初学者haskell程序员

haskell - 有没有更好的方法来编写 "string contains X"方法?

haskell - 尾递归识别

java - 如何在java中导出霍夫曼解码/编码项目的树数据结构?

java - 如何读取 .zip 文件的前两个字节以确认是否存在适当的魔数(Magic Number)?

haskell - Haskell 中的 const (++) 类型

c++ - `cabal repl` 导致带有 C++ 文件的简单项目出现 GHC panic

c++ - 这是将位写入大端的正确方法吗?