P13 (**) 列表的遊程編碼(直接編碼)

問題描述

實現遊程編碼。在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))]))))))

思路很直接:

  1. 初始列表爲空,返回空列表;
  2. 若遇到列表結束,返回包含(N E)或E的列表;
  3. 若遇到相同的元素,繼續遍歷列表,此時N+1;
  4. 否則,將該(N E)保存到列表中,進入新的(N E)的過程。
發佈了48 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章