2017-01-04 2 views
0

Ich beginne zu studieren Lisp und ich finde einen Code auf dem Buch als Beispiel, aber ich verstehe nicht, wofür es ist. Kannst du mir helfen, das zu verstehen? Ich weiß nicht, ob es der richtige Ort dafür ist. Vielen Dank alleErklärung eines Lisp-Codes

(defun compress (l1)    
    (cond ((null (cdr l1)) '()) 
     (t (accumula (car l1) 1 (cdr l1))))) 


(defun accumula (val acc lst) 
    (cond ((null lst) (cons (comp-list val acc) nil)) 
     ((eq val (car lst)) (accumula val (1+ acc) (cdr lst))) 
     (t (cons (comp-list val acc) (accumula (car lst) 1 (cdr lst)))))) 

(defun comp-list (val acc) 
    (if (> acc 1) (list acc val) val)) 
+1

[Diese Seite] (https://gist.github.com/kidd/262204) bietet einige Beispieleingaben und -ausgaben, um die Funktion zu demonstrieren. '(compress '(3 3 4 3 3 2 1 1 1 1 0))' ergibt' ((2 3) 4 (2 3) 2 (4 1) 0) ' –

+0

Gibt es eine definierte Funktion namens" compress "in lispeln? – Anna

+0

Ich weiß es nicht. Ich bezweifle das. Vielleicht in Common Lisp. –

Antwort

1

Es ist eine Kompressionsfunktion, der Run Length Encoding Vielfalt.

(compress '(3 3 4 3 3 2 1 1 1 1 0)) 

wird

((2 3) 4 (2 3) 2 (4 1) 0) 

ergeben, wo die erste Zahl in jeder Unterliste die Anzahl von Malen ist, die zweite Zahl in der ursprünglichen Sequenz wiederholt.

Es sieht nicht sehr nach dem Beispiel aus, aber bei langen Sequenzen, bei denen sich die Anzahl sehr oft wiederholt, können Sie erhebliche Einsparungen bei den Speicherkosten erzielen.

+0

Dank @Robert für die Herstellung. Ich werde versuchen, wieder zu komprimieren (4 3) 4 2 ... Was ich eigentlich brauche. Ich finde es ziemlich schwierig – Anna

+0

Nur verstehen, dass Sie nicht in der Lage sein werden, die ursprüngliche Sequenz zu rekonstruieren, wenn Sie das tun, weil Sie die Positionierungsinformationen verlieren werden (wo die Dreien in der ursprünglichen Reihenfolge gefunden wurden). –

+0

Ja, ich verstehe vollkommen, dass ich die Sortiereigenschaft verlieren werde. Es ist nur eine Möglichkeit, eine schwierige Übung zu machen – Anna

1

Dies ist eine Antwort auf Problem 13 in The 99 Lisp problems (L99). Es hat einen Fehler:

(compress '(a)) 
; ==> nil 

Das richtige Ergebnis (a) gewesen wäre.