莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理
              來自sicp的完整代碼,包括書中給出的代碼以及習(xí)題,實(shí)現(xiàn)了huffman樹的生成、解碼、編碼過程,總共67行代碼,同樣的代碼有空用java、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))
          ;合并最低權(quán)重的兩個(gè)節(jié)點(diǎn)
          (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)))))



          主站蜘蛛池模板: 汾西县| 靖宇县| 东乡| 石河子市| 三明市| 友谊县| 石泉县| 邹平县| 曲麻莱县| 九寨沟县| 昌邑市| 西城区| 朔州市| 东平县| 安多县| 略阳县| 晋中市| 甘谷县| 台东县| 盐山县| 丰原市| 福海县| 清丰县| 奉贤区| 浦江县| 彩票| 宁南县| 海门市| 尼勒克县| 沧州市| 醴陵市| 沧源| 宁国市| 富宁县| 虹口区| 眉山市| 申扎县| 台湾省| 萝北县| 丹东市| 济源市|