Übung zur generativen Rekursion - Uni

Werbung
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)?
Herunterladen