OOP Rekursive und Iterative Definition

shiroX

Mitglied
Hallo liebe Gemeinde, ich hoffe ihr könnt mir helfen.

Ich scheitere bei einer Hausübung für die Uni an einer eigentlich simplen Aufgabe, aber irgendwie stehe ich auf dem Schlauch. Wir sollen für eine Definition eine rekursive und eine iterative Lösung schreiben. Die rekursive ist denkbar einfach, diese habe ich auch ohne Probleme hinbekommen, und zwar diese hier:

Java:
public class Aufgabe6b {

	public static void main(String[] args) {
		int n = 3;
		System.out.println("Ergebnis ist: "+fRek(n));
		
		
	}
			
		public static int fRek (int n){
			if (n <= 0){
				return 1;
			
				}else if (n == 1){
					return 2;
					
					}else if (n > 1){
						return 4*fRek(n-2)-1;
							//4 * fRek(3-2)-1 4*fRek(1)-1;
							// = 4 * 2 = 8 - 1 = 7
					}
			return n;
			
			
		}
	}

So, nun bekomme ich aber die iterative Lösung irgendwie nicht hin weil die Zahl die ich möchte nicht rauskommt, wenn ich die Funktion nicht nochmal aufrufe, hier mein Lösungsansatz iterativ:

Java:
public class Aufgabe6c {

	public static void main(String[] args) {
		int n = 1;
		System.out.println("Ergebnis ist: "+fRek(n));

	}
		public static int fRek(int n){
			for (int i=0; i<=n; i++){
				if (n<=0){
					return 1;
				}
				if (n == 1){
					return 2;
				}
				if (n > 1){
					return 4*(n-2)-1;
				}
				
			}
			return n;
			
		}
}

Also wenn ich n = 0 oder n = 1 setze dann kommt auch der richtige return-Wert, allerdings fehlt unten noch irgendwas, damit bei n=3 z.B. ebenfalls 7 rauskommt - aber ich komme irgendwie nicht drauf.
Vielleicht könnt ihr mir ja helfen.

Danke im Voraus

Gruß Max
 
Also die Returns in der Schleife werden dir sicherlich nicht helfen.
Du musst dir eigentlich immer nur die letzten 2 Zahlen speichern, damit du den nächsten berechnen kannst.

a: n = 0 => 1
b: n = 1 => 2
c: n = 2 => 4 * a - 1
d: n = 3 => 4 * b - 1
e: n = 4 => 4 * c - 1
f: n = 5 => 4 * d - 1

Du benötigst immer die letzten zwei werte und kannst dann aus dem kleineren von beiden den Nächsten berechnen.
 
a: n = 0 => 1
b: n = 1 => 2
c: n = 2 => 4 * a - 1
d: n = 3 => 4 * b - 1
e: n = 4 => 4 * c - 1
f: n = 5 => 4 * d - 1

Ist doch schonmal ein Ansatz.
Jetzt das ganze noch splitten in Gerade und ungerade Zahlen.

Gerade:
a: n = 0 => 1
c: n = 2 => 4 * a - 1
e: n = 4 => 4 * c - 1

Ungerade
b: n = 1 => 2
d: n = 3 => 4 * b - 1
f: n = 5 => 4 * d - 1

Berechnung von Geraden Zahlen hat nichts mit ungeraden zu tun.

Gerade:
a: n = 0 => 1
c: n = 2 => 3
e: n = 4 => 11

Ungerade
b: n = 1 => 2
d: n = 3 => 7
f: n = 5 => 27

if(n % 2 == 0){
int sum = 1;
for(int i = 0; i<n; i=i+2) {
sum = 4 * sum - 1;
}
return sum;
} else {
int sum = 2;
for(int i = 1; i<n; i=i+2) {
sum = 4 * sum - 1;
}
return sum;
}
 

Zurück
Oben