Как указано в заголовке, я пишу функцию для вычисления кодов Хаффмана для символов в дереве, но чувствую себя совершенно потерянным.
Ветвь выглядит так:
{:kind :branch, :frequency frequency, :left child0, :right child1}
Лист выглядит так:
{:kind :leaf, :frequency frequency, :value symbol}
А сам код структурирован так:
{:tree tree, :length length, :bits bits}
У меня уже есть основная функция (выглядит так):
(defn huffman-codes
"Given a Huffman tree, compute the Huffman codes for each symbol in it.
Returns a map mapping each symbol to a sequence of bits (0 or 1)."
[T]
(into {} (for [s (all-symbols T)] [s (find-in-tree s T '())])
)
)
all-symbols
вернуть набор всех символов в дереве, и я должен написать вспомогательную функцию find-in-tree
, которая находит битовую строку символа
EDIT: Я пробовал это сейчас, и это приближает меня к тому, что я хочу, но все еще не так (см. Сообщение об ошибке ниже)
(defn find-in-tree
[s T l]
(if (isleaf? T)
{(:value T) l}
(merge (find-in-tree s (:left T) (concat l '(0)))
(find-in-tree s (:right T) (concat l '(1)))
)
)
)
ERROR -- got' {:c {:d (0 0 0), :c (0 0 1), :b (0 1), :a (1)}, :b {:d (0 0 0), :c (0 0 1), :b (0 1), :a (1)}, :d {:d (0 0 0), :c (0 0 1), :b (0 1), :a (1)}, :a {:d (0 0 0), :c (0 0 1), :b (0 1), :a (1)}} ', expected ' {:d (0 0 0), :c (0 0 1), :b (0 1), :a (1)} '
Он получает все правильные биты строк, но присваивает всю карту каждому значению, и я не знаю, что не так.