P09 (**) 把連續重複的列表元素打包爲子列表

問題描述

如果列表內包含有重複的元素且連續,則應當將它們放入單獨的子列表內,如:

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重新進入下一個累計過程。

發佈了48 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章