【SICP练习】96 练习2.69

简介:

练习2.69

如题目中所说,传入给successive-merge的参数是一个有序的集合。而这个函数将通过不断的归并得到最终的一个元素。如果传入的集合为0,也就是说返回的表应该是空表。如果传入的集合为1,那么将传入的集合的car部分取出来,这就是Huffman树了。而如果传入的集合大于1,那么就要多做些处理了。因为集合已经做好了排序,这里所谓的排序自然就是按照的权重了。因此最前面的元素其权重也最小。如题中所说,这里要调用make-code-tree来得到新的树。当然了,到了这一步应该将用掉的这两个元素从原来的集合中删除掉。然后将新的树和遗留下来的树通过adjoin-tree结合起来,再作为参数传给我们所写的这个函数,很明显,这是一个递归的过程。

(define (successive-merge ordered-set)
    (cond ((= 0 (length ordered-set))())
          ((= 1 (length ordered-set)) (car ordered-set))
          (else (let ((new-sub-tree (make-code-tree (car ordered-set) (cadr ordered-set))) (remained-ordered-set (caddr ordered-set)))
                 (successive-merge (adjoin-set new-sub-tree remained-ordered-set))))))

这里是用了一个remianed-ordered-set来间接的删掉用过的2个元素。



感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


目录
相关文章