从霍夫曼树中取出对子

时间:2013-03-12 00:04:49

标签: list tree scheme huffman-code

我正在尝试写一个程序霍夫曼离开;该过程返回创建的霍夫曼树中的对列表。 关于它如何运行的示例

  (huffman-leaves sample-tree) 
   ->((A . 8) (C . 5) (B . 1) (D . 1))

我已经搞砸了但是让作家们阻止......

(define (huffman-leaves tree)
  (define (huffman-get-pairs current-branch pairs)
     (if (or (null? tree) (null? current-branch))
         pairs
         (let ((next-branch
                (get-branch (car current-branch) current-branch)))
           (not (member? next-branch pairs)
                (if (leaf? next-branch)
                    (cons (append  pairs next-branch)
                          (display pairs)
                          (huffman-get-pairs (cadr current-branch) pairs))
                    (huffman-get-pairs next-branch pairs))))))
  (huffman-get-pairs tree '()))

  (member? item 'list) #if item in list return #t else #false

我知道我做错了但我看不到。 如何在方案中停止搜索霍夫曼树?我应该做的不同的任何提示?

1 个答案:

答案 0 :(得分:3)

我建议:

  1. 为Huffman Tree编写数据定义

  2. 根据您在步骤1中的数据定义编码的示例输入霍夫曼树和预期输出(在这种情况下为叶子列表)。

  3. 按照design recipehuffman-leaves功能构建基本模板。

  4. 根据您在步骤2中构建的示例填写模板中的...

  5. 将您的示例从第2步翻译成测试,并测试第4步中的代码。

  6. 对不起,如果上面看起来模糊不清,但这是我能给出的最好的建议,你在这个问题中提供的详细程度(或缺乏)。如果您可以为上述步骤提供答案,并明确说明您被阻止的步骤,那么我们可以帮助您以更系统的方式克服您的作者阻止。


    如果您更喜欢真实的代码,可以通过以下方向为您的问题制定一个非常通用的解决方案:

    ;; make-visitor : (X -> Y) (X -> [Listof X]) (Y [Listof Z] -> Z) -> Z
    ;; Very generic descend+map+recombine routine
    ;; (note X, Y, Z are implicitly universally quantified above).
    (define (make-visitor transform children combine)
      (lambda (x)
        (let rec ((x x)) ;; rec : X -> Z
          (combine (transform x)
                   (map rec (children x))))))
    
    ;; ... the hard bit is coming up with the appropriate lambda
    ;; expressions for `transform`, `children`, and `combine` above.
    
    (define leaves
      (make-visitor (lambda (x) ...)
                    (lambda (x) ...)
                    (lambda (y zs) ...)))
    

    我实际上并不建议尝试直接跳转到此表单的解决方案;如果您尝试遵循设计方案并直接解决问题,那将会更好。但是,一旦你这样做了,看看你是否可以将你自己的解决方案改进到上面的通用例程上,这可能是一种教育练习。