原子Lのリストを取る関数(エンコードL)を書き込み、ランレングスは、(出力形式のペアのリストであることがリストは、コード値の長さ)ここで、最初の要素は値で、2番目は値がエンコードされたリストで発生する回数です。例えば
:
(encode '(1 1 2 4 4 8 8 8)) ---> ((1 2)(2 1)(4 2)(8 3))
これは今のところ私が持っているコードです:
(define (encode lst)
(cond
((null? lst) '())
(else ((append (list (car lst) (count lst 1))
(encode (cdr lst)))))))
(define (count lst n)
(cond
((null? lst) n)
((equal? (car lst) (car(cdr lst))) (count (cdr lst) (+ n 1)))
(else (n)))))
は、だから私は、この文句を言わない仕事を知っている私は本当に数をカウントする方法を考えるカントので、リスト内の特定のアトムを効果的に削除することができます。また、前の(値の長さ)のペアを保存してから、リスト内の次の一意の原子をカウントするまで移動します。基本的には、私の主な問題は、私の(値の長さ)のペアを作成するためにリストに表示されている原子の量のカウントを維持する方法を考え出しています。
私はこれを正しく実装したコードを、追加することができました必要です。これは今私にとってはるかに理にかなっています。 – Frank
@Frankをお手伝いします。変数の変更を模倣するための引数を追加するトリックは、通常、Schemeの問題の解決策です。 Schemeには、関数名を失うことなくletのように書くための名前付きletという名前があります。 – Sylwester
@Sylwesterあなたのコメントにあなたが記述した名前の 'let'フォームを使ってコードを修正しました^ _^ – naomik