;; 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. eine 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: ist etwas eine Zahl? (: 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 42) 1) (check-expect (number-of-leaves (list 2 3)) 2) (check-expect (number-of-leaves t1234) 4) #;(define number-of-leaves (lambda (t) ...)) ; Konstruktionsschablone für gemischte Daten: #;(define number-of-leaves (lambda (t) (cond ((leaf? t) ...) ((empty? t)...) ((cons? t) ...)))) ; Konstruktionsschablone für Bäume (analog zu Listen) #;(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))...)))) (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)))))))