16. Rekursion

Werbung
16. Rekursion
Übungen
Übung 1
So kann man es auch machen
Gegeben sei folgende Funktion
int mc(int n)
{
if ( n>100 )
return n-10;
else
return mc(mc(n+11));
}
Welcher Wert ergibt sich für n=150, 110, 100,97,95,...?
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
2
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
3
Übung 2
Der Intelligenztest
Was ergibt sich für a(n) und b(n) für n=0,1,2,3,4,5,6,7,8;
int a(int n)
{ int b(int);
if ( n<=0 )
return 0;
else
return b(n-1)+1;
}
int b(int n)
{ int a(int);
if ( n<=0 )
return 0;
else
return a(n-1)-2;
}
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
4
a(i) = [-i + 3*(i%2)]/2
b(i) = a(i+3)
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
5
Übung 3
Das Ägyptische Verfahren
Was liefert die Funktion für a=4/b=5 bzw. a=7/b=8? Was liefert f generell?
int f(int a,int b)
{
if ( b==1 ) return a;
else if ( b%2==0 ) return f(2*a,b/2);
else
return a+f(2*a,(b-1)/2);
}
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
6
Es handelt sich um eine Methode zur Multiplikation
Denn
a*b
= a falls b=1
= (2*a) * (b/2) falls b gerade
= a*[ 2*(b-1)/2 +1 ]
= (2*a)*[(b-1)/2] + a falls b ungerade
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
7
Übung 4
Das ungelöste Rätsel
Erstellen Sie eine Tabelle der Funktionswerte von f(n) für n=1,...,10;
int f(int n)
{
if ( n==1 )
return 1;
else if ( n%2==0 )
return f(n/2);
else
return f(3*n+1);
}
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
8
Der Funktionswert ist immer 1
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
9
Übung 5
Sind a und b natürliche Zahlen mit a > b, so ändert sich der größte
gemeinsame Teiler nicht, wenn man anstelle von a und b stattdessen a-b
und b nimmt. Nützen Sie dies zu einem rekursiven Algorithmus aus.
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
10
int ggt(int a,int b)
{
if ( a>b )
return ggt(a-b,b);
else if ( a<b )
return ggt(b-a,a);
else
return a;
}
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
11
Übung 6
In einem String ist ein Ausdruck mit Klammern ( und )
gespeichert . Erstellen Sie eine rekursive Funktion bool
klammern(string), welche prüft, ob die Klammerstruktur
korrekt ist. Hinweis: verwenden Sie die Methoden find,
rfind, substr der Klasse string.
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
12
//---------------------------------------//Aufgabe 6
//---------------------------------------bool klammer(string text)
{
// suche erste )
int klammerzu=(int)text.find(")");
if ( klammerzu<0 ) //keine da
return (int)text.find("(" )<0 ; // true falls auch keine ( da
// suche ( davor
int klammerauf=(int)text.rfind("(",klammerzu-1);
if ( klammerauf<0 )// keine ( da
return false;
else //Klammerpaar loeschen
return klammer(text.erase(klammerauf,klammerzu-klammerauf+1));
}
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
13
//---------------------------------------//Aufgabe 6 Ohne rekursion
//---------------------------------------bool klammer(string text)
{
int klammerauf=0, laenge=(int)text.length();
for ( int i=0;i<laenge;i++)
{
if ( text.at(i)=='(' )
klammerauf++;
else if ( text.at(i)==')' )
{
if ( klammerauf==0 )// ) ohne (
return false;
else
klammerauf--;
}
}
return klammerauf==0;// zu viele (
}
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
14
Übung 7
Erstellen Sie für die Klasse Bauteil eine Methode
bool pruefe_verbindung(Bauteil* ptr),
welche ermittelt, ob der Ausgang eines Bauteils über andere Bauteile mit
dem im Parameter ptr adressierten Bauteil verbunden ist (muss nicht
leitend sein).
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
15
bool pruefe_verbindung(Bauteil *ptr)
{
if ( ausgang==ptr )
return true;
else if ( ausgang==NULL )
return false;
else
return ausgang->pruefe_verbindung(ptr);
}
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
16
Übung 8
Binomialkoeffizienten lassen sich auch mittels der Rekursion
n
k
n-1
n-1
+ k-1
=
k
definieren. Nützen Sie dies in einer Funktion zur Bestimmung der
Binomialkoeffizienten aus. Bilden sie den Aufrufbaum für ein
Beispiel Ihrer Wahl.
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
17
int binom(int n,int k)
{
if ( k==0 )
return 1;
else if ( n==0 )
return 0;
else
return binom(n-1,k)+binom(n-1,k-1);
}
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
18
Wildcard
Implementieren Sie eine Funktion bool wildcard(string pattern, string
text), welche überprüft, on eine Zeichenkette pattern in einer
Zeichenkette text enthalten ist. Dabei darf in pattern das Symbol * als
Platzhalter für eine beliebige Zeichenkette mehrfach verwendet
werdet. Zur Vereinfachung darf dabei angenommen werden, dass das
Symbol * nicht 2 mal hintereinander vorkommt.
Beispiel:
Suchen von Dateien
pattern ist prak*cpp
Es werden alle Dateien gesucht,
deren Name mit prak beginnt und cpp endet.
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
19
Eine chaotische Funktion
Q(1)=1, Q(2)=1
Q(n)=Q(n-Q(n-1)) + Q(n-Q(n-2))
Die ersten Zahlen
1 1 2 3 3 4 5 5 6 6 6 8 8 8 10 9 10 ... ?
aus
Douglas R. Hofstadter
Gödel, Escher, Bach
Dr. Norbert Spangler / Grundlagen der Informatik
07.06.2007
20
Herunterladen