Konzepte der Programmiersprachen, Sommersemester 2014 Übung zur generativen Rekursion Bearbeiten Sie diese Aufgaben in kleinen Gruppen. Sie müssen nicht alle Aufgaben bearbeiten, aber: Achten Sie selbstständig darauf, die Lernziele zu erreichen! Helfen Sie sich bei Bedarf gegenseitig oder fragen Sie Ihre Tutorin oder Ihren Tutor. Lernziele • Erkennen von generativer Rekursion • Entwerfen mit generativer Rekursion Nach der Bearbeitung dieser Aufgabe können Sie generative und strukturelle Rekursion unterscheiden und in Ihren Programmen verwenden. Erkennen von generativer Rekursion Das größte gemeinsame Teiler (greatest common divisor, gcd) zweier Zahlen ist die größte natürliche Zahl, die beide Zahlen teilt. Hier sind zwei Programme, um den größten gemeinsamen Teiler zu berechnen: ; A Positive is one of: ; -1 ; - (add1 Positive) ; interp. positive natural numbers. ; A Positive is one of: ; -1 ; - (add1 Positive) ; interp. positive natural numbers. ; Positive Positive → Positive ; check whether b evenly divides a (check-expect (divisable 15 5) true) (check-expect (divisable 5 3) false) (define (divisable a b) (equal? (remainder a b) 0)) ; Positive Positive → Positive ; find the greatest common divisor of two numbers (check-expect (gcd1 25 6) 1) (check-expect (gcd1 18 24) 6) (define (gcd1 a b) (local [(define (search candidate) (cond [(equal? candidate 1) 1] [(and (divisable a candidate) (divisable b candidate)) candidate] [else (search (sub1 candidate))]))] (search (min a b)))) ; Positive Positive → Positive ; find the greatest common divisor of two numbers (check-expect (gcd2 25 6) 1) (check-expect (gcd2 18 24) 6) (define (gcd2 a b) (local [(define (search larger smaller) (cond [(equal? smaller 0) larger] [else (search smaller (remainder larger smaller))]))] (search (max a b) (min a b)))) 1. Welches dieser Programme benutzt strukturelle Rekursion? 2. Welches benutzt generative Rekursion? 3. Wieso terminieren die Programme? 4. Bei welchem Programm ist es einfacher zu verstehen, daß es terminiert? 5. Bei welchem Programm ist es einfacher zu verstehen, daß es korrekt ist? 6. Welches Programm ist vermutlich schneller? Beantworten Sie die folgenden Fragen aus dem Entwurfsrezept für generativ-rekursive Funktionen für die Version des gcd-Programmes, das generative Rekursion benutzt: 7. Was ist ein trivial lösbares Problem? 8. Was ist eine Lösung für ein trivial lösbares Problem? 9. Wie generieren wir neue Probleme, die leichter zu lösen sind als das Originalproblem? Wie viele neue Probleme generieren wir? 10. Wie berechnen wir aus der Lösung der generierten Probleme die Lösung des Originalproblems? Benötigen wir dazu nochmal das Originalproblem (oder einen Teil davon)?