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