【SICP练习】95 练习2.68

练习2.68

先要导入练习2.67中的sample-tree。这道题要求我们写出能够根据给定的树产生出给定符号的二进制位表的函数encode-symbol,这个函数还要能够在遇到未在树中出现的符号时报错。这个函数将要在给定的树中查找给定符号的叶子节点,并记录下寻找过程中的左右方向,当然了,如书中所说,向左则用0,向右则用1。因此该函数可以如下列出。我们先来写那个检测错误的谓词。

(define (symbol-in-tree? gven-symbol tree)
    (not (false? (find (lambda (s) (eq? s given-symbol))
                     (symbols tree)))))
(define (encode-symbol symbol tree)
   (cond ((leaf? tree) ‘())
         ((symbol-in-tree? symbol (left-branch tree))
          (cons 0 (encode-symbol symbol (left-branch tree))))
         ((symbol-in-tree? symbol (right-branch tree))
          (cons 1 (encode-symbol symbol (right-branch tree))))
         (else 
          (error “Error: symbol not in this tree!”))))
如此一来便可以得出encode了。
(define (encode message tree)
    (if (null? message)
      ‘()
       (append (encode-symbol (car message) tree)
                (encode (cdr message) tree))))

通过测试我们发现和上一题中的结果完全符合,如前面所说要导入sample-tree。

(encode( a d a b b c a) sample-tree)
;Value: (0 1 1 0 0 1 0 1 0 1 1 1 0)



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


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值