2016-04-21 13 views
0

Ich versuche, mit einem kompositorischen Tool namens OpenMusic, die eine grafische Entwicklungsumgebung basierend auf gemeinsamen Lisp ist, zu arbeiten, und es verwendet etwas namens "Rhythm Trees". Ich versuche, Rhythmus Bäume mit einem Satz von Regeln und in OM diesem Baum zu erstellen, muss die folgende Struktur haben:OpenMusic: L-System Tree-Generierung mit Lisp

  • Ein Baum eine Liste mit zwei Elementen ist
  • Sein erstes Element ist ein Knoten
  • Seine zweites Element ist eine Liste ihrer Kinder (die auch Bäume sein kann)

eine Baumtiefe n, eine anfängliche einzelnen Knotenbaum (1) und Transformationsregeln Gegeben:

  • (1) -> (1 2)
  • (2) -> (1)

soll es geben:

n = 1 -> (1 (1 2))

+2

Also, wo ist die Frage? Denken Sie daran, dies ist kein Code-Writing-Service;) –

+0

Sie haben Recht @Daniel die Frage ist: Wie kann ich dieses Verhalten rekursiv definieren? Antwort kann einfach Englisch sein, also kein Code-Service. Ich habe keine Ahnung, wo ich anfangen soll. Ich brauche nicht einmal eine Antwort, nur ein Anstupsen in die richtige Richtung wäre mehr als genug. – kureta

+0

@kureta Können Sie versuchen, die Frage ein wenig besser zu erklären? Fügen Sie vielleicht ein paar Beispiele für Funktionsaufrufe hinzu, deren Ergebnisse und wie das Ergebnis erreicht wurde (schreiben Sie im Grunde den Prozess aus, den der Computer ausführen soll). So wie es jetzt ist, kann ich zumindest nicht herausfinden, was du willst. Ich meine, du beginnst mit '(1)'. Dies wird gemäß der ersten Regel in "(1 2)" umgewandelt. Es gibt keine Transformationsregel für '(1 2)' also wie kommt man zu '(1 (1 2))'? Sollen die Atome in diesem auch umgewandelt werden (aber dann hättest du '((1 2) (1))')? – jkiiski

Antwort

1

Rekursive Algorithmen für Bäume/Listen werden normalerweise mit COND geschrieben. Sie finden heraus, was die Endbedingungen sind, und stellen Sie diese zuerst. Behandle dann Atome und leite schließlich über eine Liste, indem du rekursiv die Funktion auf ihre CAR und CDR und CONS die Ergebnisse aufruft, um die Ausgabeliste zu erzeugen. So ist die grundlegende Vorlage ist wie:

(defun algo (list) 
    (cond 
    ((end-condition) suitable-end-value) 
    ((atom list) (do-something-with-atom list)) 
    (t (cons (algo (car list) 
      (algo (cdr list)))))) 

In diesem Fall wäre das so etwas wie:

(defun rhythm-tree (n tree) 
    (cond ((zerop n) tree)     ; First end-condition. 
     ((null tree) '())    ; Another end-condition. 
     ((atom tree)      ; An atom: transform into... 
     (cons tree      ; a list of the atom itself... 
       (list (rhythm-tree (1- n) ; and a list of children. 
            (case tree 
            (1 (list 1 2)) 
            (2 (list 1)) 
            (otherwise '())))))) 
     ;; Iterate over elements of a list. 
     (t (cons (rhythm-tree n (car tree)) 
       (rhythm-tree n (cdr tree)))))) 

(rhythm-tree 1 1) 
;=> (1 (1 2)) 
(rhythm-tree 2 1) 
;=> (1 ((1 (1 2)) (2 (1)))) 
+0

Vielen Dank! Das war unglaublich hilfreich. – kureta