問題描述
實現遊程編碼。在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)的過程。