【SICP练习】96 练习2.69

本文深入探讨了Huffman树的构建过程,特别是使用successive-merge函数处理有序集合的方法。通过对不同集合大小的条件判断,逐步讲解如何通过归并操作形成最终的Huffman树。

练习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.youkuaiyun.com/nomasp


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.youkuaiyun.com/nomasp

转载于:https://my.oschina.net/nomasp/blog/503413

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值