ÜBUNGEN ZUR REKURSION

Ähnliche Dokumente
Syntax der Sprache PASCAL

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Datentypen: integer, char, string, boolean

INFORMATIK FÜR BIOLOGEN

zu große Programme (Bildschirmseite!) zerlegen in (weitgehend) unabhängige Einheiten: Unterprogramme

Klausur in 12.1 Themen: Zahlsysteme, Grundlagen von Delphi (Bearbeitungszeit: 90 Minuten)

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16

Mathematische Rekursion

Tag 4 Repetitorium Informatik (Java)

Schriftliche Reifeprüfung aus INFORMATIK: Klasse 8D Haupttermin 2002/03

C.3 Funktionen und Prozeduren

1953/54 (USA) PS FORTRAN (FORmula TRANslating system) 1958/60 (Europa) ALGOL (ALGOrithmic Language)

Teil VI: Prozeduren Feld-Parameter & Typen. 1. Offene ARRAY-Parameter 2. Prozedurtypen und -variablen

Einführung in die Programmierung mit VBA

Lösungsvorschlag Serie 2 Rekursion

Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 1 (Kapitel 1)

Lösungen zu den Übungsaufgaben zu Feldern

Algorithmen & Programmierung. Rekursive Funktionen (1)

Ursprünge. Die Syntax von Java. Das Wichtigste in Kürze. Konsequenzen. Weiteres Vorgehen. Rund um Java

Vorkurs Mathematik für Informatiker. 1 Potenzen. Michael Bader, Thomas Huckle, Stefan Zimmer Oktober Kap.

Frühjahr. Erste Staatsprüfung für ein Lehramt an öffentlichen Schulen. Prüfungsteilnehmer Prüfungstermin Einzelprüfungsnummer. - Prüfungsaufgaben -

Tag 4 Repetitorium Informatik (Java)

Crashkurs Python und Sage U23 Krypto-Mission

Klassenvariablen, Klassenmethoden

Java Übung. Übung 2. Werner Gaulke. 19. April Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung.

Die Syntax von Java. Ursprünge. Konsequenzen. Das Wichtigste in Kürze. Weiteres Vorgehen. Rund um Java. Sun Microsystems. Borland Software Corp

Probeklausur Programmieren in C Sommersemester 2007 Dipl. Biol. Franz Schenk 12. April 2007, Uhr Bearbeitungszeit: 105 Minuten

Funktionen in Matlab. Nutzerdefinierte Funktionen können in.m-datei gespeichert werden

Ein Stundenentwurf zur graphische Darstellung der Baumrekursion

Mathematische Anwendersysteme Einführung in MuPAD

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Klausur: Informatik I am 06. Februar 2009 Gruppe: D Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:

1.) Zahlensysteme (10 Punkte)

Übung zu Einführung in die Informatik # 11

Programmieren in C. Rekursive Strukturen. Prof. Dr. Nikolaus Wulff

E-PRIME TUTORIUM Die Programmiersprache BASIC

2. Algorithmische Methoden 2.1 Rekursion. 18. April 2017

Ansätze zur Erfassung von Faktoren durch Prüfungsaufgaben. (Diskussionen in Dagstuhl sowie mit Prof. Nickolaus, Technikpädagogik, U Stuttgart)

Programmierkurs: Delphi: Einstieg

JAVA für Nichtinformatiker - Probeklausur -

Wintersemester 2010/2011 Hinweise zur Bearbeitung der Klausur zum Kurs 1613 Einführung in die imperative Programmierung

C++ - Kontrollstrukturen Teil 2

Kurs 1613 Einführung in die imperative Programmierung Musterlösung zur Klausur am

4.Grundsätzliche Programmentwicklungsmethoden

C-Probeklausur (Informatik 1; Umfang: C, Teil 1; SS07)

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

Algorithmen und Datenstrukturen Heapsort

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Lehrstuhl Informatik VI Grundzüge der Informatik * WS 2008/2009 Prof. Dr. Joachim Biskup

Theoretische Informatik SS 03 Übung 4

4 Rekursionen. 4.1 Erstes Beispiel

Excel Funktionen durch eigene Funktionen erweitern.

Informatik I: Einführung in die Programmierung

Programmierkurs Java

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

einlesen n > 0? Ausgabe Negative Zahl

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

Android-Apps Gegenüberstellung Delphi java

Kurs 1613 Einführung in die imperative Programmierung Musterlösung zur Nachklausur am

Klausur "ADP" SS 2015

Der Dreyfus-Wagner Algorithmus für das Steiner Baum Problem

Vorlesung Objektorientierte Programmierung Klausur

Institut für Informatik Christian-Albrechts-Universität zu Kiel. Borland Delphi. Einführung in die Programmiersprache

Schleifenprogrammierung in C/C++, Fortran und Pascal

Programmierkurs Java

Folgen und Funktionen in der Mathematik

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Seite 1 von 13 Name: Aufgabe 1: Suchalgorithmen (a) (4 Punkte ) Gegeben ist folgendes Streckennetz:

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

Kapitel 1: Informationsverarbeitung durch Programme

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Modul 122 VBA Scribt.docx

Über Arrays und verkettete Listen Listen in Delphi

Informatik für Schüler, Foliensatz 18 Rekursion

Übersicht Shell-Scripten

Um mit dem Computer über ein Programm in Kontakt treten zu können braucht man sogenannte Ein- und Ausgabebefehle.

Aufgabe 1 (12 Punkte)

Algorithmen und Datenstrukturen"

Informatik GK 12 Klassen Klassen programmieren in Delphi am Beispiel der konkreten Klasse Auto

Reguläre Ausdrücke. Michael Jäger. 4. April 2017

Algorithmen und Datenstrukturen"

Anwendungsentwicklung 2. Teil

Schmitt, Günter (1996): Fortran 90 Kurs technisch orientiert, R. Oldenbourg Verlag, München

= 7 (In Binärdarstellung: = 0111; Unterlauf) = -8 (In Binärdarstellung: = 1000; Überlauf)

Funktionale Programmierung. Funktionale Programmierung: Vorlesungsüberblick. Eigenschaften rein funktionaler Programmierung

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

7 Endliche Automaten. 7.1 Deterministische endliche Automaten

Übungen Programmieren 1 Felix Rohrer. Übungen

Rekursive Funktionen (1)

Lineare Klassifikatoren (Kernel)

Kurs 1613 Einführung in die imperative Programmierung

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

Institut fu r Informatik

Kapitel 1: Informationsverarbeitung durch Programme

Funktionen in JavaScript

Programmieren lernen mit Groovy Rekursion Rekursion und Iteration

1 Potenzen und Polynome

Transkript:

ÜBUNGEN ZUR REKURSION Aufgabe 1: Auf einem früheren Arbeitsblatt wurde eine rekursive DELPHI-Funktion zur Berechnung der Quadratzahl zu einer natürlichen Zahl n vorgestellt, welche mathematisch wie folgt definiert war: quad( n 1) + n + n 1 n > 1 quad ( n) = 1 n = 1 a) Stellen Sie den rekursiven Abstieg grafisch dar. b) Ermitteln Sie für den Funktionsaufruf quad(5) die Gesamtanzahl an Vergleichs- und Strichoperationen. c) Schreiben Sie eine DELPHI-Function quad2(n: integer): integer, welche die Quadratzahl nun iterativ berechnet. Nutzen Sie dazu folgende Beziehung: 1² = 1, 2² = 3 + 1, 3² = 5 + 3 + 1, 4² = 7 + 5 + 3 + 1, 5² = 9 + 7 + 5 + 3 + 1,... d) Ermitteln Sie auch zu Ihrer Funktion die Gesamtanzahl an Vergleichs und Strichoperationen. Vergleichen Sie mit Teilaufgabe b. Hinweis: Die FOR-Schleife for i:= 1 to n beinhaltet implizit die Addition i:= i + 1 sowie den Vergleich i <= n. Aufgabe 2: Schreiben Sie jeweils eine rekursive Prozedur, welche die folgenden Grafiken erzeugt: a) b) c) Aufgabe 3: Hinter den Ziffernfolgen 1, 121, 1213121, 121312141213121, 1213121412131215121312141213121,... verbirgt sich ein interessantes rekursives Bildungsgesetz. a) Beschreiben sie dieses Bildungsgesetz in eigenen Worten. b) Schreiben Sie eine Function Ziffernfolge (n: Integer): String, welche die n-te Ziffernfolge als String zurückgibt. c) Warum sollte die Funktion einen String und keine Zahl zurückgeben? Begründen Sie!

Aufgabe 4: Betrachten Sie die folgende DELPHI-Prozedur: procedure TF_Wort.Wort(n: Integer; w: string); var i: char; if n=0 then M_Ausgabe.Lines.Add(w) else for i:= 'A' to 'F' do Wort(n-1,w+i) a) Beschreiben Sie in eigenen Worten die Wirkung der Prozedur. Welche Ausgabe wird getätigt, wenn die Prozedur mit Wort(3, ) gestartet wird? b) Wie muss man das Programm abändern, damit die produzierten Worte nur aus unterschiedliche Buchstaben bestehen. Hinweis: Implementierung auch ohne Hilfe des Mengentyps (Set of...) möglich. Dazu müssen nur in dem vordefinierten Wort ABCDEF lediglich Buchstaben getauscht anstatt angehängt werden. Aufgabe 5: Wie viele Möglichkeiten gibt es, ein DM-Stück in Ein-, Zwei-, Fünf-, Zehn- und Fünfzigpfennigstücke zu wechseln? Allgemein: Ein Land hat k Münzwerte m[1] = 1, m[2] =?,..., m[k] =?. Auf wie viele Arten kann man b Geldeinheiten mit Hilfe dieser Münzen bezahlen? a) Machen Sie sich klar, dass es für 10 Pfennig insgesamt 11 verschiedene Möglichkeiten der Bezahlung gibt. b) Entwickeln Sie eine rekursive Function a(b, k: Integer): Integer, welche die Anzahl der Möglichkeiten, b Geldeinheiten mit k verschiedenen Münzen m[1..k] zu zahlen, berechnet. Hinweis: Sei a(b,k) die Anzahl der Möglichkeiten, b Geldeinheiten mit Münzen zu bezahlen, deren Werte in der Reihung m[1..k] gespeichert sind; m[1] = 1. Dann lässt sich das Problem auf das kleinere Problem, den Betrag b m[k] zu wechseln, reduzieren. Es gibt aber a(b m[k],k) Möglichkeiten, unter Verwendung von m[k] zu zahlen, und a(b,k 1) Möglichkeiten, ohne die Münze vom Wert m[k] zu zahlen. c) Sei m[1..5] = (1,2,5,10,50). Stellen Sie den rekursiven Abstieg für den Aufruf a(10,5) grafisch dar (Baumdiagramm). Begründen Sie damit die 11 Bezahlungsmöglichkeiten aus Teilaufgabe a. d) Entwickeln Sie eine Prozedur, welche alle Möglichkeiten der Bezahlung explizit in einem Memofenster auflistet (siehe rechts abgedrucktes Beispiel-Formular).

LÖSUNGEN ZU DEN ÜBUNGEN Aufgabe 1: a) + b) Strichop.: Verleiche: Quad(5) 1 Quad(5 1) + 5 + 5 1 4 1 Quad(4 1) + 4 + 4 1 4 1 Quad(3 1) + 3 + 3 1 4 1 Quad(2 1) + 2 + 2 1 4 1 1 16 5 c) Function quad2(n: integer): integer; Var i, Ergebnis: Integer; Ergebnis:= 0 for i:= 1 to n do Ergebnis:= Ergebnis + i + i 1; d) Anzahl Strichop.: 20 (da i:= i + 1); Anzahl Vergleiche: 6 (da bei i = 6 auch geprüft wird). Aufgabe 2: a) Procedure Baum(n: Integer; Laenge: Real); VW(Laenge); if n>1 then DL(45); Baum(n-1, Laenge*0.7) DR(90); Baum(n-1, Laenge*0.7) DL(45); RW(Laenge); b) Procedure Quadrat(n: Integer; Laenge: Real); VW(Laenge/2); for i := 1 to 3 do if n>1 then Quadrat(n-1, Laenge/2); VW(Laenge); if n>1 then Quadrat(n-1, Laenge/2); VW(Laenge/2);

c) Procedure Trauerweide(n: Integer; Laenge: Real); VW(Laenge); DR(15); VW(Laenge); DR(15); VW(Laenge); RW(Laenge); DL(15); RW(Laenge); DL(15); RW(Laenge); DR(45); VW(Laenge); RW(Laenge); DR(15); RW(Laenge); DR(15); RW(Laenge); DL(30); RW(Laenge); Aufgabe 3: a) Eine neue Zahl entsteht durch Verdopplung der vorangegangenen Zahl, wobei die Verdopplung durch die Ziffer der Rekursionstiefe getrennt wird. b) function zf(n: integer): string; if n<1 then zf:= '' else zf:= zf(n-1)+inttostr(n)+zf(n-1); c) Integer-Zahlen sind auf den Zahlenbereich 2 15.. +2 15 1 begrenzt. Selbst Longint-Zahlen ( 2 31.. +2 31 1) reichen als Zahlenbereich nicht aus. Also kann man die Ziffernfolge besser als Zeichenkette auffassen. Aufgabe 4: a) Es werden alle Wörter mit drei Buchstaben über dem Alphabet A..F gebildet. AAA, AAB, AAC,..., AAF, ABA, ABB,..., AFF, BAA, BAB,..., FFF (insgesamt 6 3 Wörter). b) Procedure TF_Wortbildung.Permut(wort: string; n: integer); var i: integer; if n = length(wort) then Memo1.Lines.Add(wort) else for i:= n to length(wort) do Vertausche(wort[i], wort[k]); { Sollte klar sein } Permut(wort, n+1); Eine Lösung mit Verwendung des Mengentyps wäre wie folgt: type TZeichen = 'A'..'F'; TMZeichen = Set of TZeichen;... procedure TF_Wortbildung.Permut(wort: string; n: Integer; MZeichen: TMZeichen); var i: TZeichen; if n=0 then M_Ausgabe.Lines.Add(wort) else for i:= 'A' to 'F' do if i in MZeichen then Permut(wort+i, n-1, MZeichen-[i])

Aufgabe 5: a) 10; 5+5; 5+2+2+1; 5+2+1+1+1; 5+1+1+1+1+1; 2+2+2+2+2; 2+2+2+2+1+1; 2+2+2+1+1+1+1; 2+2+1+1+1+1+1+1; 2+1+1+1+1+1+1+1+1; 1+1+1+1+1+1+1+1+1+1 b) const muenzen:array[1..5] of integer=(1,2,5,10,50);... function Anzahl(b: integer; k: integer): integer; if k=1 then Anzahl:= 1 else if b<muenzen[k] then Anzahl:= Anzahl(b,k-1) else Anzahl:= Anzahl(b-muenzen[k],k) + Anzahl(b,k-1); c) Die Rekursionsanker sind jeweils unterstrichen. An diesen Stellen wird die Anzahl um 1 erhöht. Insgesamt 11 Rekursionsanker Anzahl = 11. Anzahl(10,5) A(10,4) A(0,4) + A(10,3) A(0,3) A(5,3) + A(10,2) A(0,2) A(0,3) + A(5,2) A(8,2) + A(10,1) A(0,1) A(0,2) A(3,2) + A(5,1) A(6,2) + A(8,1) A(0,1) A(1,2) + A(3,1) A(4,2) + A(6,1) A(1,1) A(2,2) + A(4,1) A(0,2) + A(2,1) A(0,1) d) procedure TF_Wechseln.Wechseln(b: Integer; k: integer; w: string); var i: integer; if b=0 then M_Ausgabe.Lines.Add(w) else if w<>'' then w:= w+'+'; for i:= k downto 1 do if b>=muenzen[i] then Wechseln(b-muenzen[i],i,w+IntToStr(muenzen[i]))