C++ - Kontrollstrukturen Teil 2

FB Informatik Prof. Dr. R.Nitsch C++ - Kontrollstrukturen – Teil 2 Reiner Nitsch ℡ 8417 [email protected] Schleife und Verzweigung kombiniert...
Author: Eduard Bader
1 downloads 1 Views 140KB Size
FB Informatik Prof. Dr. R.Nitsch

C++ - Kontrollstrukturen – Teil 2

Reiner Nitsch ℡ 8417

[email protected]

Schleife und Verzweigung kombiniert

FB Informatik Prof. Dr. R.Nitsch

Wichtiger Baustein vieler Algorithmen!

SV initialisieren while(B1) if(B2) w f V1 V2

Beispiel: Ägyptische Multiplikation für natürliche Zahlen ⎧ b ⎪⎪2ai 2 aib = ⎨ ⎪2aib + a ⎪⎩ 2

SV Richtung Ziel verändern

falls b gerade falls b ungerade

Ganzzahldivision!

Erklärung: a = 20, b = 23 a • b = 2a • b/2 +

a

20 • 23 = 40 • 11 +

1 • 20

40 • 11 = 80 •

5 +

1 • 40

80 • 5 = 160 •

2 +

1 • 80

160 • 2 = 320 •

1 +

0 • 160

320 • 1 = 640 •

0 +

1 • 320

Binärdarstellung von b 101112 = 2310 2010 • 101112 = 20 •(1 •24 + 0 •23 + 1 •22 + 1 •21 + 1 •20 ) = 320 + 0 •160 + 1 •80 + 1 •40 + 1 •20 = 460

→ 20 • 23 = 460 17.05.2008

C++ Kontrollstrukturen - Teil 2

2

Ägyptische Multiplikation in C++

FB Informatik Prof. Dr. R.Nitsch

int multiply( int a , int b ) { Produkt = 0 assert( a>0 && b>0 ); int product = 0; solange b > 0 while ( b > 0 ) { b ungerade? if ( b%2 == 1 ) // ist b ungerade ja nein product += a; Produkt um else a erhöhen ; a verdoppeln a *= 2; b /= 2; b halbieren } // while (b>0) return product; } Alternative Realisierung mit Bitmanipulationen • Test auf "b ungerade" durch Bittest → 101112 b = 2310 testmuster → 000012 = 110 b & testmuster → 00001 • Verdopplung:

• Halbierung:

a = 2010 = 000101002

b = 2310 = 000101112

2a = 4010 = 00101000 2

b/2 = 1110 = 00010112

0

17.05.2008

C++ Kontrollstrukturen - Teil 2

3

Ägyptische Multiplikation in C++

FB Informatik Prof. Dr. R.Nitsch

int multiply( int a , int b ) { int product = 0; while ( b>0 ) { if ( b&1 ) // ist b ungerade product += a; else ;

} // while (b>0) return product; }

17.05.2008

C++ Kontrollstrukturen - Teil 2

4

Rekursion

FB Informatik Prof. Dr. R.Nitsch

• Rekursive Funktionen – rufen sich wiederholt selbst auf – tun dies, um jeweils ein kleineres Problem zu lösen – enden erst dann ohne erneuten Selbstaufruf, wenn das Problem so klein ist, dass es gelöst werden kann (→ base case). Beispiel: Dreieckszahlen d0 = 0 d1 = 0 + 1 d2 = 0 + 1 + 2 d3 = 0 + 1 + 2 + 3 n

n ( n + 1)

k =0

2

dn = ∑ k =

Iterative Lösung:

d0

x d1

x x x d2

x x x x x x d3

x x x x x x x x x x d4

x x x x x

x x x x x x x x x x d5

int triangleNumber ( int n ) { assert(n>=0); int result = 0;

assert(result == n*(n+1)/2 ); return result ; } 17.05.2008

C++ Kontrollstrukturen - Teil 2

5

Rekursive Berechnung der Dreieckszahlen Rekursive Definition der Dreickzahlen:

x x x x x

dn = n + Rest = n + dn-1

x x x x x x x x x x

FB Informatik Prof. Dr. R.Nitsch

int triangleNumber( int n ) { assert( n>=0 );

d5 = 5 + Rest } 5 + d4 Aufruf in main: Rekursion wird durch das Konzept der lokalen cout 0

FB Informatik Prof. Dr. R.Nitsch

// Rekursive Lösung long factorial ( int n ) { assert ( n>=0 );

Rekursive Definition

17.05.2008

C++ Kontrollstrukturen - Teil 2

7

Noch ein Beispiel

FB Informatik Prof. Dr. R.Nitsch

Invertieren einer beliebig langen Zeichenkette

void reverseString () { char c; cin >> c; if ( c == '\n' ) return; else { reverseString (); cout 1

Anwendung: Wachstumssimulation von Populationen Erklärung: Hasenpopulation h: Häschenpaar; 1 Monat Reifezeit H: Schwangere Häsin; 1 Monat Tragezeit)

FB Informatik Prof. Dr. R.Nitsch

Rekursive Realisierung in C++ long Fibonacci( int n ) { assert (n>=0);

}

Iterative Realisierung in C++ long Fibonacci ( int n ) { assert (n>=0); Monat Population long Fn, Fn_1(1), Fn_2(1); 0 h if (n1) { F(n) = F(n-1) + F(n-2) 4 HHHhh Fn = Fn_1 + Fn_2 5 HHHHHhhh Fn_2 = Fn_1; 6 HHHHHHhhhhh Fn_1 = Fn; n--; } return 1; 9 17.05.2008 C++ Kontrollstrukturen - Teil 2 }

Türme von Hanoi - Problembeschreibung

17.05.2008

A

B

C

Subturm

Aufgabe: Turm aus 100 Scheiben umsetzen • 2 Ablagestellen • immer nur eine Scheibe transportieren • Es darf keine größere auf einer kleineren Scheibe liegen • Turm von A nach C unter Zuhilfenahme von B Algorithmischer Kern 1. Turm außer unterster Scheibe (Subturm) transportieren von A nach B (kleineres Problem) 2. unterste Scheibe transportieren von A nach B (base case) 3. Subturm von C nach B transportieren (kleineres Problem)

FB Informatik Prof. Dr. R.Nitsch

C++ Kontrollstrukturen - Teil 2

10

Türme von Hanoi - Implementation

FB Informatik Prof. Dr. R.Nitsch

void move( int amount, char from, char to, char hilfe ) { static int width(-5); //statische Variable mit Gültigkeitsbereich Programm width += 5; cout