问题描述
如果列表内包含有重复的元素且连续,则应当将它们放入单独的子列表内,如:
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
重新进入下一个累计过程。