问题描述
实现游程编码。在P11中我们利用到了中间的计算结果–P09生成的连续重复的元素列表,该问题要求不创建这个中间结果,而仅仅利用这些元素的个数。如
sash> (encode-modified '(a a a a b c c a a d e e e e))
sash> ((4 a) b (2 c) (2 a) d (4 e))
解法
(define encode-direct (lambda (ls) (if (null? ls) '() (let ([to-ne (lambda (n e) (if (= n 1) e (list n e)))]) (let f ([e (car ls)] [t (cdr ls)] [n 1]) (cond [(null? t) (list (to-ne n e))] [(equal? e (car t)) (f e (cdr t) (+ n 1))] [else (cons (to-ne n e) (f (car t) (cdr t) 1))]))))))
思路很直接:
- 初始列表为空,返回空列表;
- 若遇到列表结束,返回包含(N E)或E的列表;
- 若遇到相同的元素,继续遍历列表,此时N+1;
- 否则,将该(N E)保存到列表中,进入新的(N E)的过程。