Neue Wertzuweisung in for - Schleife

123michi19

Lt. Junior Grade
Registriert
Okt. 2014
Beiträge
324
Hey Leute,

ich habe ein kleines Problem mit einem Programm. Wie schaffe ich es denn, das in einer for-Schleife mein zuletzt berechneter Wert innerhalb der Schleife wieder als Ausgangswert verwendet wird?

Hier erst einmal das Programm, dann wird auch meine Frage klarer :)

Code:
/*Wurzelberechnung.java*/
public class Wurzelberechnung
{
	public static void main (String[]args)
	{
		// 1. Ausgangszahl eingeben
		// 2. Ausgangszahl durch 2 teilen --> Ergebnis 
		// 3. (2 + Ergebnis) / 2 = Ergebnis 1
		// 4. Ausgangszahl / Ergebnis1 = Ergebnis2
		// 5. Ergebnis1 + Ergebnis2 = Ergebnis3
		// 6. Ergebnis drei in A setzen und von vorne anfangen
		
		float Ausgang = 12.0F;
                float Ergebnis;	 	
                float Ergebnis1;
		float Ergebnis2;
		float Ergebnis3 = 0;
						
		for (int i=0; i<10; i++)
		{
			// Hier sollte nach dem 1. Durchlauf Ergebnis3 in den Wert von Ausgang geschrieben werden
			Ergebnis = Ausgang / 2.0F; //12 durch 2 = 6
			Ergebnis1 = (2.0F + Ergebnis)/2.0F; // (2 + 6) / 2 = 4
			Ergebnis2 = Ausgang / Ergebnis1;	// 12 / 4 = 3
			Ergebnis3 = Ergebnis1 + Ergebnis2; //4+3 = 7
		}	
		System.out.println ();
	}		
}


Vielen Dank für Eure Hilfe :-)
 
Hi,

du kannst z.B. die Variablen Ausgang und Ergebnis3 zusammenführen und nur noch Ausgang verwenden. Damit würdest du in der letzen Zeile Ergebnis3 durch Ausgang ersetzen.

Wenn du das allerdings nicht willst, kannst du auch eine if-anweisung schreiben:

Code:
/*Wurzelberechnung.java*/
public class Wurzelberechnung
{
	public static void main (String[]args)
	{
		// 1. Ausgangszahl eingeben
		// 2. Ausgangszahl durch 2 teilen --> Ergebnis 
		// 3. (2 + Ergebnis) / 2 = Ergebnis 1
		// 4. Ausgangszahl / Ergebnis1 = Ergebnis2
		// 5. Ergebnis1 + Ergebnis2 = Ergebnis3
		// 6. Ergebnis drei in A setzen und von vorne anfangen
		
		float Ausgang = 12.0F;
                float Ergebnis;	 	
                float Ergebnis1;
		float Ergebnis2;
		float Ergebnis3 = 0;
						
		for (int i=0; i<10; i++)
		{ 
                       if(i > 0){
                          Ausgang = Ergebnis3;
                       }
			// Hier sollte nach dem 1. Durchlauf Ergebnis3 in den Wert von Ausgang geschrieben werden
			Ergebnis = Ausgang / 2.0F; //12 durch 2 = 6
			Ergebnis1 = (2.0F + Ergebnis)/2.0F; // (2 + 6) / 2 = 4
			Ergebnis2 = Ausgang / Ergebnis1;	// 12 / 4 = 3
			Ergebnis3 = Ergebnis1 + Ergebnis2; //4+3 = 7
		}	
		System.out.println ();
	}		
}
 
Vielen Dank für Eure Antworten. Ich hatte das so bereits probiert, allerdings kamen da die falschen Werte dabei heraus.

Ihr meint
Code:
/*Wurzelberechnung.java*/
public class Wurzelberechnung
{
	public static void main (String[]args)
	{
		// 1. Ausgangszahl eingeben
		// 2. Ausgangszahl durch 2 teilen --> Ergebnis 
		// 3. (2 + Ergebnis) / 2 = Ergebnis 1
		// 4. Ausgangszahl / Ergebnis1 = Ergebnis2
		// 5. Ergebnis1 + Ergebnis2 = Ergebnis3
		// 6. Ergebnis drei in A setzen und von vorne anfangen, das ganze ca. 10 mal zur genauen Bestimmung von Wurzelwert
		
		float Ausgang = 12.0F;
	 	float Ergebnis1;
		float Ergebnis2;
		float Ergebnis;
		float Ergebnis3 = 0;
						
		for (int i=0; i<10; i++)
		{
			// Hier sollte nach dem 1. Durchlauf Ergebnis3 in den Wert von Ausgang geschrieben werden
			Ergebnis3 = Ausgang;
			Ergebnis = Ausgang / 2.0F; //12 durch 2 = 6
			Ergebnis1 = (2.0F + Ergebnis)/2.0F; // (2 + 6) / 2 = 4
			Ergebnis2 = Ausgang / Ergebnis1;	// 12 / 4 = 3
			Ergebnis3 = Ergebnis1 + Ergebnis2; //4+3 = 7
		}	
		System.out.println (Ergebnis3);
	}		
}
 
Ich denke, du solltest in deinem Eingangspost
Ergebnis3 = Ausgang
vor der Schleife setzen und dann innerhalb der Schleife Ausgang durch Ergebnis3 ersetzen.
 
Es handelt sich übrigens um ein klassisches Problem welches man am besten Rekursiv löst.
 
Dir ist schon klar, dass du hier eine EMPFEHLUNG für JAVA mit BEISPIELEN aus LISP begründest?
Es gibt sicher viele Fälle, in denen eine rekursive Lösung "eleganter" ist, aber in diesem Fall wüsste ich nicht warum. Hinzu kommt, dass Rekursionen in Sprachen wie Java, C, C++ ... häufig ineffizienter sind als iterative Lösungen (wenn der Compiler sie nicht ohnehin in eine iterative Version überführt).
 
Ach du. Ich habe das nie als Empfehlung gemeint, sondern als Antwort auf deine Frage. Auch war ich nicht der Mensch, der die Idee überhaupt ins Spiel gebracht hat und ich würde es selbst wohl auch nicht rekursiv machen.
 
Definitiv Rekursion, weil es einfach der sauberste Code ist.
Die Ergebnisse landen bei Rekursionsabbruch auf dem Stack und werden zum Schluss einfach (automatisch) verrechnet.

Allerdings ist Rekursion etwas was ordentlich Leute aus dem Studium haut...vielleicht ein Grund mehr es vor dem Studium an einfacheren Beispielen zu üben. Sonst wird es später böse wenn es heißt programmier einen B-Baum :D
 
Zuletzt bearbeitet:
Zieht denn dieser seltsame Code überhaupt die Wurzel aus einer Zahl oder dient die Bezeichnung der Klasse nur der Verwirrung?
 
@dc22: Vielleicht stehe ich ja auf dem Schlauch, aber zeig mir bitte, wie genau du den Code (in Java) rekursiv schreiben würdest und wieso der sauberer sein soll als die iterative Variante oben.
Muss aber gestehen, dass ich eher aus dem Embeddedbereich komme und man da mit rekursiven Funktionen häufig etwas vorsichtig sein muss (sowohl aus Performance als auch aus Speicher gründen).

Ich würde das übrigens so schreiben:
Code:
/*Wurzelberechnung.java*/
public class Wurzelberechnung
{
	public static void main (String[]args)
	{		
	        float Ausgang = 12.0F;					
		for (int i=0; i<10; i++)
		{			
			float Ergebnis = Ausgang / 2.0F; //12 durch 2 = 6
			float Ergebnis1 = (2.0F + Ergebnis)/2.0F; // (2 + 6) / 2 = 4
			float Ergebnis2 = Ausgang / Ergebnis1;	// 12 / 4 = 3
			Ausgang = Ergebnis1 + Ergebnis2; //4+3 = 7
		}	
		System.out.println (Ausgang);
	}		
}

EDIT:
@Ochse: Das habe ich mich auch schon gefragt ;)
 
Zuletzt bearbeitet:
Ochse schrieb:
Zieht denn dieser seltsame Code überhaupt die Wurzel aus einer Zahl oder dient die Bezeichnung der Klasse nur der Verwirrung?
Die Funktion ist ein Spezialfall des Newtonverfahrens. Ihr Fixpunkt ist die Quadratwurzel. Erklärung steht in den Links, die ich postete.
 
@asdfman
Hab Probleme den pseudo-Lisp-Code zu lesen. Zuerst dachte ich der TE versucht das Heron-Verfahren zu implementieren, was auch ein Spezialfall des Newton-Verf. ist, aber das scheint es nicht zu sein. Weisst du zufällig den Namen des Verfahrens?
 
Ok, ich war offensichtlich zu voreilig. Ich postete den Ausschnitt aus SICP eben weil ich angenommen habe, OP versucht das Heron-Verfahren zu implementieren (Addieren und Durchzweiteilen und die Funktion heißt noch "Wurzeln"). Jetzt, wo ich mir die Berechnung auch mal richtig angesehen habe, kann ich nur sagen: Keine Ahnung, was OP da macht. Möglicherweise versucht er sogar tatsächlich das Heron-Verfahren zu implementieren, scheitert dabei aber und sucht dann seinen Fehler an der falschen Stelle.
 
Zurück
Oben