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