来自sicp的完整代码,包括书中给出的代码以及习题,实现了huffman树的生成、解码、编码过程,总共67行代码,同样的代码有空用java、ruby改写下,看看会有什么不同。
ruby 代码
- (define (make-leaf symbol weight)
- (list 'leaf symbol weight))
- (define (leaf? object)
- (eq? (car object) 'leaf))
- (define (symbol-leaf x) (cadr x))
- (define (weight-leaf x) (caddr x))
- ;合并最低权重的两个节点
- (define (make-code-tree left right)
- (list left right (append (symbols left) (symbols right)) (+ (weight left) (weight right))))
- (define (left-branch tree) (car tree))
- (define (right-branch tree) (cadr tree))
- (define (symbols tree)
- (if (leaf? tree)
- (list (symbol-leaf tree))
- (caddr tree)))
- (define (weight tree)
- (if (leaf? tree)
- (weight-leaf tree)
- (cadddr tree)))
- ;解码
- (define (decode bits tree)
- (define (decode-1 bits current-branch)
- (if (null? bits)
- '()
- (let ((next-branch
- (choose-branch (car bits) current-branch)))
- (if (leaf? next-branch)
- (cons (symbol-leaf next-branch)
- (decode-1 (cdr bits) tree))
- (decode-1 (cdr bits) next-branch)))))
- (decode-1 bits tree))
- (define (choose-branch bit branch)
- (cond ((= bit 0) (left-branch branch))
- ((= bit 1) (right-branch branch))
- (else (display "bad bit --CHOOSE-BRANCH"))))
- (define (adjoin-set x set)
- (cond ((null? set) (list x))
- ((< (weight x) (weight (car set))) (cons x set))
- (else
- (cons (car set) (adjoin-set x (cdr set))))))
- (define (make-leaf-set pairs)
- (if (null? pairs)
- '()
- (let ((pair (car pairs)))
- (adjoin-set (make-leaf (car pair) (cadr pair)) (make-leaf-set (cdr pairs))))))
-
- ;编码
- (define (encode message tree)
- (if (null? message)
- '()
- (append (encode-symbol (car message) tree)
- (encode (cdr message) tree))))
- (define (encode-symbol symbol tree)
- (define (iter branch)
- (if (leaf? branch)
- '()
- (if (memq symbol (symbols (left-branch branch)))
- (cons 0 (iter (left-branch branch)))
- (cons 1 (iter (right-branch branch))))
- ))
- (if (memq symbol (symbols tree))
- (iter tree)
- (display "bad symbol -- UNKNOWN SYMBOL")))
- ;根据符号权重列表,生成hufman树
- (define (generate-huffman-tree pairs)
- (successive-merge (make-leaf-set pairs)))
-
- (define (successive-merge leaf-set)
- (if (null? (cdr leaf-set))
- (car leaf-set)
- (successive-merge (adjoin-set (make-code-tree (car leaf-set)
- (cadr leaf-set))
- (cddr leaf-set)))))
分享到:
相关推荐
scheme源代码scheme 阴阳题源代码
在移动应用开发中,"scheme"是一种常见的机制,用于实现应用程序间的交互,即从一个应用启动另一个应用。本文将深入探讨scheme如何实现唤醒外部APP,以及它在Webview和浏览器环境中的应用。 首先,理解scheme的基本...
作为基于JVM的实现,JSchemeMin 让Scheme程序可以调用Java平台的API,也让Java程序运行Scheme代码,这使Scheme可作为Java(以至别的JVM语言)程序的一种扩展语言。目前,JSchemeMin 只提供解释器而非编译器。基本的...
《Scheme实现的八皇后问题详解》 八皇后问题是一个经典的计算机科学问题,它涉及到回溯算法、排列组合以及编程设计模式。在这个问题中,我们需要在8×8的棋盘上放置8个皇后,使得任意两个皇后都不能在同一行、同一...
Cheme语言实现的八皇后问题.
通过对`Alamouti_scheme.m`和`ber_QAM.m`文件的分析,我们可以深入理解空时编码的工作原理,并通过实验调整来探索MIMO系统的潜力。这种技术对于现代无线通信,特别是移动通信网络,具有重要的理论和应用价值。
而`Scheme`可能是源代码文件,可能包含了上述各个部分的实现代码。 编写Scheme解释器是一个复杂但极具挑战性的任务,它涉及到编译原理、数据结构和算法等多个方面的知识。通过这个过程,你可以深入了解编程语言的...
在提供的文件列表中,`Scheme.exe`可能是编译好的Scheme解释器可执行文件,`Scheme.sln`是Visual Studio解决方案文件,包含了项目设置和依赖项,而`Scheme`可能是源代码文件夹,包含C#实现解释器的具体代码。...
5. **源码分析**:在提供的链接中,我们可以阅读实际的源代码,了解作者是如何用Scheme来实现这些功能的。代码中可能会包含一些Scheme特有的编程技巧,如递归、闭包、宏等。 6. **工具应用**:标签中提到的“工具”...
在`anti-unification-master`这个压缩包中,可能包含了实现这些步骤的Scheme源代码文件。通过阅读和理解这些代码,你可以深入了解反统一算法在Scheme中的具体实现细节。这种实现可以帮助你在实际问题中,比如在推理...
以二维list格式输入九宫格问题,用scheme函数式程序设计语言求解,对于多个解的九宫格,可以得到所有的解
这些代码可以作为实际项目中的参考,帮助开发者快速地在.NET应用程序中实现图片的Base64编码和Data URI功能。 总结起来,.NET中的图片Base64编码结合Data URI方案,能够简化Web应用的图片处理,提升用户体验。...
接下来就以我之前写的UIActivityViewController系统原生分享-仿简书分享和iOS开源小项目-WSL两个Demo为例,让我们看下怎么可以让UIActivityViewController系统原生分享-仿简书分享唤起iOS开源小项目-WSL并进行通信、...
总结,MIT-Scheme源代码的获取,不仅为我们提供了研究Lisp语言和解释器实现的窗口,也为开发者在64位Linux系统上构建和定制自己的Scheme环境提供了可能。通过深入学习和实践,我们可以进一步掌握Lisp的精髓,提升...
- **热更新**: 通过更新Scheme脚本来实现部分功能的热更新,无需完整发布新版本。 **总结** Scheme-Lib为Android开发者提供了一个独特的工具,允许他们在应用程序中利用Scheme的强大功能。它不仅可以帮助简化某些...
在上述代码中,`mycustomscheme://path/to/content`是自定义的scheme URL,当按钮被点击时,系统会尝试找到可以处理该URL的应用并启动它。 压缩包中的"doubantest"和"test"可能是两个示例项目,分别用于演示如何在...
在iOS和Android等操作系统中,开发者可以利用URL Scheme实现应用间的深度链接,从而创建丰富的用户体验,比如从一个应用内直接打开另一个应用的功能。 在iOS开发中,URL Scheme的注册通常在Info.plist文件中进行,...
这些实现大多为开源项目,提供不同的特性和优势,有的甚至可以将Scheme代码编译成C语言或者虚拟机代码。 #### 三、基本概念与语法 - **注释**: - Scheme中的单行注释以分号`;`开始直到行尾。 - 在某些实现中,...
除了Guile之外,还有许多其他的Scheme实现,例如GNU/MIT-Scheme、SCI、Scheme48和DrScheme等。这些实现大多开源且跨平台,可以根据个人需求选择合适的版本进行使用。 #### 基本概念 **注释:** Scheme支持单行注释...
Chez Scheme 是一个功能强大的 Scheme 编程语言实现,由 C 家族的编程语言编写而成,提供高效且兼容 R6RS(第六版 Scheme 报告)的标准。它以其简洁的语法、丰富的库支持以及高度可移植性而受到程序员的喜爱。在 ...