Informatik 1 - Mitschriften von Klaas Ole Kürtz

Informatik 1 - Mitschriften von Klaas Ole Kürtz Informatik 1 - Mitschriften von Klaas Ole Kürtz

28.03.2014 Aufrufe

Länge einer Liste: (define (laenge l) (if (null? l) 0 (+ 1 (laenge (cdr l))))) Erweiterungen von car bzw. cdr: (define (cadr x) (car (cdr x))) (define (caddr x) (car (cdr (cdr x)))) 3.2.1 Darstellung von Baumstrukturen Elemente von Baumstrukturen: Wurzel, innere Knoten mit Sohnknoten und Blättern, mögliche Darstellung von Knoten durch Listen: Wann ist ein Baum ein Blatt? (define (leaf? x) (not (pair? x))) Anzahl der Blätter in einem Baum? (define (blattanzahl b) (cond ((null? b) 0) ; Knoten hat keine Soehne ((leaf? b) 1) ; Knoten ist Blatt (else (+ (blattanzahl (car b)) (blattanzahl (cdr b)))))) 3.2.2 Quotieren Wünschenswert: neben Zahlen auch Symbole als atomare Objekte; Beispiel: Liste mit Symbolen (a, b, c) oder (Klaus, 4) etc. Wird dies als (list a b c) definiert, gibt es einen Fehler. Lösung: Quotieren, d.h. im Prinzip in Anführungszeichen setzen. In Scheme wird ein Apostroph vor nicht auszuwertende Ausdrücke gesetzt: >(define a 1) >(define b 2) >(list a b) (1 2) >(list ’a ’b) (a b) Es ist auch möglich, komplexe Ausdrücke zu quotieren: 24

(cdr ’(a b c)) (b c) Notwendig wir eine Möglichkeit zur Prüfung von Gleichheit zweier Symbole: eq?; Beispiel: Extrahieren der Restliste einer Liste, die mit einem bestimmten Symbol beginnt (falls nicht vorhanden: false): (define (memq e l) (cond ((null? l) #f) ((eq? e (car l)) l) (else (memq e (cdr l))))) >(memq ’b ’(a b c d)) (b c d) 3.2.3 Beispiel: Symbolisches Differenzieren • nicht numerische, sondern: ax 2 + bx + c ↦→ 2ax + b • eine Motivation für List, Teil großer Systeme (z.B. Maple) • Hier Funktionen ausgebaut auf: Zahlenkonstanten, Variablen, Summen und Produkte Darstellung von Funktionen zur Eingabe: 1. Stringdarstellung: ax + b =(a * x + b) 2. Präfixnotation: ax + b =(+ (* a x) b) (Vorteil: Prioritäten klar) Datentyp für die Funktionsdarstellung: • Konstruktoren: (trivial: Zahlen und Variablen) (define (konstr-summe a1 a2) (list ’+ a1 a2)) (define (konstr-produkt a1 a2) (list ’* a1 a2)) • Prädikate: (define (konstante? x) (number? x)) (define (variable? x) (symbol? x)) (define (summe? x) (if (pair? x) (eq? (car x) ’+) #f)) (define (produkt? x) (if (pair? x) (eq? (car x) ’*) #f)) (define (gleiche-variable? v1 v2) (and (variable? v1) (variable? v2) (eq? v1 v2))) 25

Länge einer Liste:<br />

(define (laenge l)<br />

(if (null? l)<br />

0<br />

(+ 1 (laenge (cdr l)))))<br />

Erweiterungen <strong>von</strong> car bzw. cdr:<br />

(define (cadr x) (car (cdr x)))<br />

(define (caddr x) (car (cdr (cdr x))))<br />

3.2.1 Darstellung <strong>von</strong> Baumstrukturen<br />

Elemente <strong>von</strong> Baumstrukturen: Wurzel, innere Knoten mit Sohnknoten und<br />

Blättern, mögliche Darstellung <strong>von</strong> Knoten durch Listen: Wann ist ein Baum<br />

ein Blatt?<br />

(define (leaf? x) (not (pair? x)))<br />

Anzahl der Blätter in einem Baum?<br />

(define (blattanzahl b)<br />

(cond ((null? b) 0) ; Knoten hat keine Soehne<br />

((leaf? b) 1) ; Knoten ist Blatt<br />

(else (+ (blattanzahl (car b))<br />

(blattanzahl (cdr b))))))<br />

3.2.2 Quotieren<br />

Wünschenswert: neben Zahlen auch Symbole als atomare Objekte; Beispiel:<br />

Liste mit Symbolen (a, b, c) oder (Klaus, 4) etc. Wird dies als (list a b c)<br />

definiert, gibt es einen Fehler. Lösung: Quotieren, d.h. im Prinzip in Anführungszeichen<br />

setzen. In Scheme wird ein Apostroph vor nicht auszuwertende<br />

Ausdrücke gesetzt:<br />

>(define a 1)<br />

>(define b 2)<br />

>(list a b)<br />

(1 2)<br />

>(list ’a ’b)<br />

(a b)<br />

Es ist auch möglich, komplexe Ausdrücke zu quotieren:<br />

24

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!