2013-03-12 45 views
1

我试图写一个程序Huffman-leaves;该过程从创建的哈夫曼树中返回一个对列表。 实例它如何运行从huffman树中得到对

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

什么我COMED了,但得到作家块...

(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 

我知道我做错了什么,但我不能看到它。 如何停止在计划中的huffman-tree中进行搜索?任何我应该做的提示都不一样?

+0

如果不知道霍夫曼树的数据定义,很难回答这样的问题。即,形式的评论:;; HuffmanTree是以下之一: - (列表'叶子字符频率'),或者:'(列表'节点HuffmanTree HuffmanTree')。 (我确信这个示例数据定义不是你想要的,它只是为了说明风格。 – pnkfelix 2013-03-12 01:19:35

回答

3

我建议:

  1. 写数据定义哈夫曼树

  2. 制作例如输入哈夫曼树,从第1步,根据您的数据定义编码和预期产出(叶子的名单,在这种情况下)。

  3. 按照design recipe建立huffman-leaves函数的基本模板。根据你从第2步

  4. 建立从第2步到测试翻译你的例子,并从步骤测试你的代码示例在您的模板...

  5. 填充4.

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


如果你喜欢真正的代码,这里是一个方向,你可以去,使您的问题非常通用的解决方案:

;; 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) ...))) 

我真的不建议尝试直接跳到这种形式的解决方案;如果您尝试遵循设计配方并直接解决您的问题,那么您会变得更好。但是一旦你完成了这个任务,这可能是一个教育练习,看看你是否可以将自己的解决方案改进到上面的通用例程。