我正在尝试写一个程序霍夫曼离开;该过程返回创建的霍夫曼树中的对列表。 关于它如何运行的示例
(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
我知道我做错了但我看不到。 如何在方案中停止搜索霍夫曼树?我应该做的不同的任何提示?
答案 0 :(得分:3)
我建议:
为Huffman Tree编写数据定义
根据您在步骤1中的数据定义编码的示例输入霍夫曼树和预期输出(在这种情况下为叶子列表)。
按照design recipe为huffman-leaves
功能构建基本模板。
根据您在步骤2中构建的示例填写模板中的...
。
将您的示例从第2步翻译成测试,并测试第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) ...)))
我实际上并不建议尝试直接跳转到此表单的解决方案;如果您尝试遵循设计方案并直接解决问题,那将会更好。但是,一旦你这样做了,看看你是否可以将你自己的解决方案改进到上面的通用例程上,这可能是一种教育练习。