P12 (**) 解碼遊程編碼過的列表

問題描述

該題是實現P11的逆操作,即將P11編碼過的列表進行解碼。如

sash> (decode '((4 a) b (2 c) (2 a) d (4 e)))
sash> (a a a a b c c a a d e e e e)

解法

  • 遞歸實現

    思路:(1) 將(N E)轉換爲'(E ... E)列表形式,單獨的E轉換爲'(E)列表;(2) 依次append這些列表即可得到答案。

     (define to-list
      (lambda (ne)
        (if (list? ne)
            (let f ([ls '()] [n (car ne)])
              (cond
                [(zero? n) ls]
                [else (f (cons (cadr ne) ls) (- n 1))]))
            (list ne))))
    (define decode
      (lambda (ls)
        (cond
          [(null? ls) '()]
          [else (append (to-list (car ls))
                        (decode (cdr ls)))])))        

    上面的decode也可使用reduce實現。

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