Iterative Pi Berechnung in Rekursive

tommyD

Mitglied
Hallo,

diese Art von Frage gab es zwar schon öfters aber leider passt kein Thema so recht zu meiner Aufgabe.

Mache gerade ein paar alte Klausurprüfungen durch und hänge bei einem rekursion Beispiel:

Code:
	/**
	* Berechnet eine N√§herung von PI. 
	* Je größer grad ist, desto genauer
	* ist die N√§herung.
	*
	* Wandeln Sie die Methode in eine rekursive Methode um,
	* sodass für die Implementierung keine Schleife 
	* benutzt wird.
	*
	* @param grad der Grad der Ann√§herung (grad >= 0).
	* @return Die N√§herung von PI zum Grad grad.
	*/
	public static double pi(int grad) {
	
		//CHANGE THIS BLOCK
		
		double f = 2.0;
		
		for (int i = 1; i <= grad; i++) {
		
			int a = 4*i*i;
			f = f * a/(a - 1); 
		
		}
	
		return f;	
	}


Abbruchbedingung wenn grad == 0, bei jedem Aufruf immer mit grad -=1 weitergehen.

Jetzt habe ich das Problem dass ich f nicht so einfach in der Methode deklarieren kann. Weiters versteh ich nicht wie ich die Berechnungen für a und f in der Methode zu schreiben sind ;(

Haben bis jetzt immer nur mit Strings und einfacheren Aufrufen gearbeitet. Würde mich über eine Antwort - auch Tipps zur Berechnung - freuen 🙂

lg
 
Also Rekursionen geht man wie folgt an:

Man baut sich eine public Methode die nach außen nicht auf Rekusion schließen lässt und die gleichen Parameter aufweist wie die iterative Methode:

Java:
public static double pi_rec(int grad) {
    //TODO: 
}

Danach schaut man nach, was für die Rekursion nötig ist:
Jede Rekursion in deinem Beispiel benötigt:
- f
- grad
- i

Danach bastelt man sich eine private rekursive Methode, die als Eingabeparameter die oben genannten besitzt:

Java:
private static double pi_rec(int grad, double f, int i) {
    //TODO: Abbruchbedingung! schaffen
    //TODO: Rekursion bauen
}

Die Abbruchbedingung ist bei der iterativen Lösung ist, wenn i > grad wird.

Java:
private static double pi_rec(int grad, double f, int i) {
    if(grad > i) return ?;
    else return ?;
}

Man muss natürlich die Startbedingung schaffen für die private rekursive Methode:

Java:
public static double pi_rec(int grad) {
    return pi_rec(grad, ?/* f */, ? /* i */);
}

Und nachdem jetzt schon alles da steht, kommst du ab jetzt von alleine weiter!
 
Danke Danke Danke 🙂


Super Erklärung und hab das und andere Beispiele super Lösen können 🙂


Hier noch meine Lösung, sollte sie sonst wer suchen:
public static double pi2(int grad){


return pi_rec(grad, 2.0, 1);


}

private static double pi_rec(int grad, double f, int i){

if(i<=grad) {


int a = 4*i*i;
f = f * a/(a - 1);
return pi_rec(grad, f, i+1);
}

else return f;

}
 

Zurück
Oben