Yahoo Clever wird am 4. Mai 2021 (Eastern Time, Zeitzone US-Ostküste) eingestellt. Ab dem 20. April 2021 (Eastern Time) ist die Website von Yahoo Clever nur noch im reinen Lesemodus verfügbar. Andere Yahoo Produkte oder Dienste oder Ihr Yahoo Account sind von diesen Änderungen nicht betroffen. Auf dieser Hilfeseite finden Sie weitere Informationen zur Einstellung von Yahoo Clever und dazu, wie Sie Ihre Daten herunterladen.

Rekursiv zu Iterativ?

Hallo alle miteinander!

Ich habe heute in Informatik eine Hausaufgabe bekommen die mir stundenlanges Kopfzerbrechen bereitet. Ich bin nicht ganz schlecht damit das ganze in ein "Programm" zu verpacken, allerdings unpassenderweise ein derartiger Legastheniker in Mathe, dass ich mit dem Anfang der Aufgabe nicht zurecht komme.

Es geht um folgendes:

public int berechne(int i){

if (i<3){return 3;}

else {return 2*berechne(i-1)-berechne(i-2)+1;}

Legt man dafür eine Wertetabelle an kommt folgendes bei raus:

i = 1 / 2 / 3 / 4 / 5 / 6 / 7

berechne(i) = 3 / 3 / 4 / 6 / 9 / 13 / 18

Nun soll ich dafür eine iterative Lösung anbieten, als while- und als for-Schleife. Was mir grundsätzlich keine Probleme bereiten würde. Doch ist mir leider eine entsprechende Formel nicht eingefallen.

Ich bin sehr dankbar für Hilfestellung!

Gruß

WM

2 Antworten

Bewertung
  • vor 1 Jahrzehnt
    Beste Antwort

    Hallo WM,

    die Formel steht schon da (2*berechne(i-1)-berechne(i-2)+1), Du musst nur alles von unten aufbauen. D.h. Du berechnest zuerst das, was für berechne(1) entstehen würde, dann darauf aufbauend berechne(2) usw bis Du bei berechne(i) angelangt bist.

    Dafür benötigst Du Variablen, die das letzte ( berechne(i-1) ) und vorletzte ( berechne(i-2) ) Ergebnis speichern.

    Mögliche Lösung:

    public int berechne(int n){

    int erg = 3;

    int vorletztes=3;

    for(int i = 3; i<=n; i++){

    int ergneu = 2*erg - vorletztes + 1;

    vorletztes = erg;

    erg = ergneu;

    }

    return erg;

    }

    erg fungiert in der Zeile "int ergneu = 2*erg - vorletztes + 1;" als berechne(i-1), da es zu diesem Zeitpunkt noch das letzte Ergebnis aus dem vorherigen Schleifendurchlauf enthält. Das letzte Ergebnis ist bei der nächsten Berechnung natürlich das vorletzte Ergebnis, darum wird es anschließend in "vorletztes = erg;" gespeichert und mit "erg = ergneu" das eigentliche Ergebnis dieses Schleifendurchlaufs an erg übergeben.

    Die Schleife selbst kann in diesem Fall erst bei i = 3 beginnen, weil alle berechne(i) für i<3 das Ergebnis 3 auswerfen sollen. Die Schleife kann also für i<3 übersprungen werden.

    Grüße

  • Anonym
    vor 1 Jahrzehnt

    Lösungsansatz:

    Du schaust dir an, wie die Rekursion definiert ist, vorallem auf welche bereits berechneten Elemente sie aufbaut.

    a[i] = 3, für i<3

    a[i] = 2*a[i-1] - a[i-2] + 1, sonst

    In diesem Fall sind das der Vorgänger und der Vorvorgänger von a[i]

    Du brauchst also 2 zusätzliche Hilfsvariablen in denen du diese beiden zwischenspeicherst und in jedem Iterationsschritt um eine Stelle verschiebst.

    public int berechne(int n)

    {

    int temp1 = 0; // = berechne(i-1)

    int temp2 = 0; // = berechne(i-2)

    int result = 0; // = berechne(i)

    for (int i = 0; i <= n; i++)

    {

    // Zwischenergebnisse aus vorigem Iterationsschritt verschieben

    temp2 = temp1;

    temp1 = result;

    // neues Ergebnis berechnen

    if (i < 3) result = 3;

    else result = 2 * temp1 - temp2 + 1;

    }

    return result;

    }

Haben Sie noch Fragen? Jetzt beantworten lassen.