问题描述
实现游程编码。在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)的过程。