Lernkarten

Karten 106 Karten
Lernende 8 Lernende
Sprache Deutsch
Stufe Universität
Erstellt / Aktualisiert 15.01.2013 / 10.02.2020
Lizenzierung Kein Urheberrechtsschutz (CC0)
Weblink
Einbinden
0 Exakte Antworten 106 Text Antworten 0 Multiple Choice Antworten
Fenster schliessen

Was passiert, wenn die Methode summeRekursiv() mit negativen Werten aufgerufen wird? Wie kann dieses Problem gelöst werden?

 

Es tritt ein StackOverflowError auf. Um dies zu verhindern, kann bei negativen Werten entweder eineIllegalArgumentException geworfen oder die Abfrage n == 0 durch n <= 0 ersetzt werden.

 

 

Fenster schliessen

Implementieren Sie eine Methode fakultaetIterativ    (int n), die iterativ die Fakultät berechnet und eine MethodefakultaetRekursiv(int n), die die Fakultät rekursiv berechnet. Die Methoden sollen dabei nur Werte  akzeptieren.

 

  int fakultaetIterativ(int n) {        // ungültige Werte abfangen        if (n < 0) {            throw new IllegalArgumentException();        }        // Ergebnis initialisieren        int erg = 1;        for (int i = 2; i <= n; i++) {            erg *= i;        }        return erg;    }    int fakultaetRekursiv(int n) {        // ungültige Werte abfangen        if (n < 0) {            throw new IllegalArgumentException();        }        // Basisfall        if (n == 0) {            return 1;        }        // rekursiver Aufruf        return n * fakultaetRekursiv(n - 1);    }
Fenster schliessen

Begründen Sie, warum die Lösung für fakultaetRekursiv() konvergiert.

 

 

 

In jedem Schritt wird n um eins verringert. Somit nähert sich n immer weiter an den Basisfall 0 an.

 

 

Fenster schliessen

Schreiben Sie die Methode double power(int p, int n), die für zwei ganze Zahlen  und  rekursiv den Wert  berechnet. Testen Sie Ihr Programm und vergleichen Sie es mit der Lösung von Selbsttestaufgabe 14.1-2, die eine iterative Variante aufzeigt.

 

 

public double power(int p, int n) {        if (n < 0) {            return 1.0 / power(p, -n);        }        if (n == 0) {            return 1;        }        return p * power(p, n - 1);    }
Fenster schliessen

Berechnen Sie alle Fibonacci-Zahlen bis und schreiben Sie die passenen Methode.

0, 1, 1, 2, 3, 5, 8, 13, 21

 

    long fibRekursiv(int n) {        if (n < 0) {            throw new IllegalArgumentException();        }        // Basisfall: n ist 0 oder 1        if (n == 0 || n == 1) {            return n;        }        // sonst: rekursiver Aufruf        return fibRekursiv(n - 1) + fibRekursiv(n - 2);    }
 

 

Fenster schliessen

Implementieren Sie eine iterative Lösung für die Berechnung der Fibonacci-Zahlen in der Methode long fibIterativ(int n).

 

    long fibIterativ(int n) {        if (n < 0) {            throw new IllegalArgumentException();        }        // Basisfall: n ist 0 oder 1        if (n == 0 || n == 1) {            return n;        }        // die ersten beiden Zahlen        int a = 0; // fib(0)        int b = 1; // fib(1)        // berechne die nächsten Zahlen        for (int i = 2; i <= n; i++) {            // fib(i) = fib(i - 1) + fib(i - 2);            int temp = a + b;            // Werte für nächste Berechnung            // speichern            a = b;            b = temp;        }        return b;     }
Fenster schliessen

Implementieren Sie eine Methode long zufallszahl(int n), die rekursiv f(n) berechnet. Implementieren Sie außerdem eine Methode void gebeZufallszahlenAus(), die die Pseudozufallszahlen f(5) bis einschließlich f(30) ausgibt.

  long zufallszahl(int n) {

        // Basisfall n < 3        if (n < 3) {            return n + 1;        }        // rekursive Aufrufe        long f1 = zufallszahl(n - 1);        long f2 = zufallszahl(n - 2);        long f3 = zufallszahl(n - 3);        // berechne Ergebnis        return 1 + (((f1 - f2) * f3) % 100);    }    void gebeZufallszahlenAus() {        for (int i = 5; i < 30; i++) {            System.out.println(zufallszahl(i));        }    }
Fenster schliessen

Ein Palindrom ist ein Wort, dass sowohl vorwärts als auch rückwärts gelesen das gleiche ist.

Implementieren Sie die Methode boolean istPalindromIterativ (String s), die iterativ prüft ob es sich bei der Zeichenkette um ein Palindrom handelt.

 

    boolean istPalindromIterativ(String s) {        int laenge = s.length();        // betrachte erste Haelfte des Wortes        for (int i = 0; i < s.length() / 2; i++) {            // und prüfe ob korrespondierendes            // Zeichen identisch ist            if (s.charAt(i) != s.charAt(laenge - 1 - i)) {                return false;            }        }        // alle Zeichen passen        return true;    }