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