;; Die ersten drei Zeilen dieser Datei wurden von DrRacket eingefügt. Sie enthalten Metadaten ;; über die Sprachebene dieser Datei in einer Form, die DrRacket verarbeiten kann. #reader(lib "DMdA-vanilla-reader.ss" "deinprogramm")((modname numtree) (read-case-sensitive #f) (teachpacks ()) (deinprogramm-settings #(#f write repeating-decimal #f #t none explicit #f ()))) ; Ein Zahlenbaum ist eins der folgenden: ; - ein Blatt, d.h. eine Zahl (number) ; - ein innerer Knoten, d.h. Liste von Zahlenbäumen (define numtree (signature (mixed number (list-of numtree)))) (: t1234 numtree) (define t1234 (list 1 (list 2 3) 4)) ; Prädikat für Blätter: (: leaf? (any -> boolean)) (define leaf? (lambda (x) (number? x))) ; Berechne die Anzahl der Blätter in einem Baum: (: number-of-leaves (numtree -> natural)) (check-expect (number-of-leaves 3) 1) (check-expect (number-of-leaves (list 1 2)) 2) (check-expect (number-of-leaves t1234) 4) #;(define number-of-leaves (lambda (t) ...)) ; Konstruktionsschablone: gemischte Daten als Eingabe #;(define number-of-leaves (lambda (t) (cond ((leaf? t) ...) ((empty? t) ...) ((cons? t) ...)))) ; Konstruktionsschablone: 3. Fall: zusammengesetzte Daten als Eingabe #;(define number-of-leaves (lambda (t) (cond ((leaf? t) 1) ((empty? t) 0) ((cons? t) ...(first t) ... (rest t)...)))) ; ähnliches Schema wie bei Listen: berechne die Anzahl der Blätter der Komponenten #;(define number-of-leaves (lambda (t) (cond ((leaf? t) 1) ((empty? t) 0) ((cons? t) ...(number-of-leaves (first t)) ...(number-of-leaves (rest t))...)))) ; Nun richtig zusammenbauen: (define number-of-leaves (lambda (t) (cond ((leaf? t) 1) ((empty? t) 0) ((cons? t) (+ (number-of-leaves (first t)) (number-of-leaves (rest t)))))))