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实现。

    原文作者:游程编码问题
    原文地址: https://blog.csdn.net/qq_17291647/article/details/50437815
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞