Informatik: Einführung in Java Rekursion mit Parametern (Lsg.)
Transcription
Informatik: Einführung in Java Rekursion mit Parametern (Lsg.)
Informatik: Einführung in Java Rekursion mit Parametern (Lsg.) Gierhardt Aufgaben: 1. Schreibe eine Methode potenz, die die n-te Potenz einer Zahl x rekursiv berechnet. 1 2 3 4 5 double potenz ( double x , int n ) { if ( n==0) return 1 ; e l s e i f ( n==1) return x ; else return x ∗ potenz ( x , n −1); } 2. Schreibe eine Methode fakultaet, die die Fakultät einer natuerlichen Zahl berechnet. 1 2 3 4 5 int f a k u l t a e t ( int n ) { i f ( n==0) return 1 ; e l s e return n ∗ f a k u l t a e t ( n −1); } 3. Schreibe eine Methode fibo, die die n-te Fibonacci-Zahl berechnet. 1 2 3 4 5 int f i b o ( int n ) { i f ( n<=2) return 1 ; e l s e return f i b o ( n−1) + f i b o ( n −2); } 4. Kara soll eine Figur aus Kleeblättern nach folgendem Schema legen. • In der ersten Zeile liegt ein Kleeblatt. • In der zweiten Zeile liegt ein Kleeblatt. • In jeder anderen Zeile liegen so viele Kleeblätter wie in den beiden darüber liegenden Zeilen zusammen. 1 import j a v a k a r a . JavaKaraProgram ; 2 3 4 5 6 7 8 public c l a s s FiboFeld extends JavaKaraProgram { void turnAround ( ) { kara . t u r n L e f t ( ) ; kara . t u r n L e f t ( ) ; } 9 10 11 void vorX ( int n , boolean b l a t t ) { i f ( n>0) 1 { i f ( b l a t t ) kara . p u t L e a f ( ) ; kara . move ( ) ; vorX ( n−1, b l a t t ) ; } 12 13 14 15 16 } 17 18 19 20 21 int f i b o ( int n ) { i f ( n<=2) return 1 ; e l s e return f i b o ( n−1) + f i b o ( n −2); } 22 23 24 25 26 27 28 29 30 31 32 void f i b o F e l d ( int maxIndex ) { for ( int i =1; i<=maxIndex ; { vorX ( f i b o ( i ) , true ) ; turnAround ( ) ; vorX ( f i b o ( i ) , f a l s e ) ; kara . t u r n L e f t ( ) ; kara . move ( ) ; kara . t u r n L e f t ( ) ; } } // Ende von f i b o F e l d i ++) // S t e h t h i n t e r l e t z t e m B l a t t // z u r u e c k // und k e i n e B l a e t t e r l e g e n // z u r maechsten Z e i l e 33 34 35 36 37 public void myProgram ( ) { fiboFeld (8); } } // Ende von F i b o F e l d 5. Schreibe eine rekursive Version der Methode geheX(int n). (siehe vorhergehende Aufgabe) 6. Die beiden Methoden geheX(int n) und legeX(int n) sollen zu einer neuen Methode vorX(int n, boolean blatt) zusammengefasst werden. Bei blatt=true wird ein Blatt beim Weitergehen gelegt, sonst nicht. Die Methode ist rekursiv zu formulieren. (siehe vorhergehende Aufgabe) 2 7. Kara soll wie dargestellt eine Spirale legen und an seinen Startpunkt zurückkehren. Benutze dazu die vorher formulierte Methode vorX(int n, boolean blatt). 1 2 3 4 5 6 7 import j a v a k a r a . JavaKaraProgram ; public c l a s s S p i r a l e extends JavaKaraProgram { void turnAround ( ) { kara . t u r n L e f t ( ) ; kara . t u r n L e f t ( ) ; } 8 9 10 11 12 13 14 15 void vorX ( int n , boolean b l a t t ) { i f ( n>0) { i f ( b l a t t ) { kara . p u t L e a f ( ) ; } kara . move ( ) ; vorX ( n−1, b l a t t ) ; } } 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 void s p i r a l e ( int l a e n g e ) { i f ( l a e n g e >=1) { vorX ( l a e n g e , true ) ; // S t e h t h i n t e r l e t z t e m B l a t t turnAround ( ) ; // Nach r e c h t s kara . move ( ) ; // zum n a e c h s t e n kara . t u r n L e f t ( ) ; // f r e i e n kara . move ( ) ; // F e l d . s p i r a l e ( l a e n g e −1); // R e k u r s i v e r A u f r u f kara . t u r n L e f t ( ) ; // und vorX ( l a e n g e , f a l s e ) ; // z u r u e c k } e l s e { turnAround ( ) ; // Drehen und kara . move ( ) ; // e i n e n S c h r i t t z u r u e c k } } // Ende von s p i r a l e 32 33 34 35 36 37 public void myProgram ( ) { spirale (12); } } // Ende von S p i r a l e 3 8. Kara soll in der Mitte einer Spirale beginnen und die Spirale so legen, dass in den „Seitenlängen“ die Fibonacci-Zahlen auftreten. 1 2 3 4 5 6 7 import j a v a k a r a . JavaKaraProgram ; public c l a s s F i b o S p i r a l e extends JavaKaraProgram { void turnAround ( ) { kara . t u r n L e f t ( ) ; kara . t u r n L e f t ( ) ; } 8 9 10 11 12 13 14 15 void vorX ( int n , boolean b l a t t ) { i f ( n>0) { i f ( b l a t t ) { kara . p u t L e a f ( ) ; } kara . move ( ) ; vorX ( n−1, b l a t t ) ; } } 16 17 18 19 20 int f i b o ( int n ) { i f ( n<=2) return 1 ; e l s e return f i b o ( n−1) + f i b o ( n −2); } 21 22 23 24 25 26 27 28 29 30 31 void f i b o S p i r a l e ( int i , int maxIndex ) // z e i c h n e t von innen nach aussen e i n e S p i r a l e , // deren " S e i t e n l a e n g e n " den F i b o n a c c i z a h l e n mit dem // I n d e x 1 b i s zum I n d e x maxIndex e n t s p r e c h e n . { i f ( i <= maxIndex ) { vorX ( f i b o ( i ) −1 , true ) ; // S t e h t h i n t e r l e t z t e m B l a t t kara . t u r n R i g h t ( ) ; // Nach r e c h t s f i b o S p i r a l e ( i +1, maxIndex ) ; // R e k u r s i v e r A u f r u f } } // Ende von f i b o S p i r a l e 32 33 34 35 36 37 public void myProgram ( ) { fiboSpirale (1 , 8); } } // Ende von F i b o S p i r a l e 4 9. Was ist der Funktionswert makkaroni(5)? 1 2 3 4 5 6 7 8 int makkaroni ( int nudel ) { i f ( nudel==1) { return 1 ; } e l s e { i f ( nudel==2) return 2 ; e l s e return 2∗ makkaroni ( nudel −2)+makkaroni ( nudel −1); } } nudel makkaroni(nudel) 1 1 2 2 3 4 4 8 5 16 10. Was ist der Funktionswert brat(5)? 1 2 3 4 5 6 7 8 int b r a t ( int k a r t o f f e l ) { i f ( k a r t o f f e l ==1) { return 1 ; } e l s e { i f ( k a r t o f f e l ==2) return 3 ; e l s e return 3∗ b r a t ( k a r t o f f e l −2)+2∗ b r a t ( k a r t o f f e l −1); } } kartoffel brat(kartoffel) 1 1 2 3 3 9 4 27 5 81 5