Ich weiß nicht, warum Du jetzt unbedingt rückwärts zählen willst. In diesem speziellen Fall funktioniert das zwar auch, aber das muss so nicht immer richtig sein.
Du solltest eher das hier verwenden:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
public static int tuwas2ite(int n) {
int erg=0;
for(int i=0;i<n;i++) {
erg = 1+2*erg;
}
return erg;
}
Im Allgemeinen kann man eine Rekursion immer so auflösen: Man implementiert einen eigenen Stack. pusht die Werte drauf, so wie die Funktion rekursiv auch aufgerufen wird und am Ende der Rekursion arbeitet man den Stack wieder ab. Bei Deinem Bsp. ist es so, dass die Funktion immer wieder rekursiv mit n-1 aufgerufen wird. Wenn ich also den Stack anschaue, wenn der Rekursionsabbruch stattfindet (wenn also die Funktion mit dem Wert 0 aufgerufen wird), dann habe ich alle Zahlen von 0 bis n auf dem Stack.
Im Anschluss wird die Rekursion zurück abgearbeitet und zwar mit den Zahlen von 0 bis n (und zwar in dieser Reihenfolge und nicht so wie Du es gemacht hat von n nach unten, überleg Dir das nochmal genau!)
Gruß
Marco
zitrone
Vielen Dank für die Antwort, ich hab das so gemacht und es funktioniert
public static int tuwas2ite(int n)
{
int erg=0;
while(n>0)
{
erg=1+2*erg;
n--;
}
return erg;
}
as_string
Also, ich würde erstmal das erg mit 0 initialisieren.
Dann ist die Rechnung doch eine andere: Da wo in der Iteration tuwas2(n-1) in der Formel steht, das ist ja in der Schleife noch der vorhergehende Wert von erg. Du kannst also einfach schreiben:
code:
1:
erg = 1+2*erg
Das i kommt ja so gar nicht mehr in der Formel vor.
Was passiert dann?
Gruß
Marco
zitrone
Rekursion in Iterativ umstellen
Meine Frage:
Hallo Leute kann mir jemand vielleicht mit der Umstellung der Methode helfen
public static int tuwas2(int n) {
return (n==0) ? 0 : 1+2*tuwas2(n-1);
}
Vielen Dank im Voraus
Meine Ideen:
Ich hab es so versucht aber klappt leider nicht
public static int tuwas2ite(int n) {
int erg=1;
for(int i=1;i<n;i++) {
erg+=2*i;
}
return erg;
}