問題描述
如果列表內包含有重複的元素且連續,則應當將它們放入單獨的子列表內,如:
sash> (pack '(a a a a b c c a a d e e e e))
sash> ((a a a a) (b) (c c) (a a) (d) (e e e e))
解法
(define pack
(lambda (ls)
(if (null? ls)
'()
(let f ([s (list (car ls))]
[t (cdr ls)])
(if (null? t)
(list s)
(let ([th (car t)])
(if (equal? (car s) th)
(f (cons th s) (cdr t))
(cons s (f (list th) (cdr t))))))))))
注意:在循環f
中,我們用s
存儲連續重複的元素,在遇到不同的元素時會將其conses到最終結果裏,然後s
重新進入下一個累計過程。