# Harmonische Reihe rekursiv berechnen?



## 0001001 (28. Feb 2006)

Meine Versuche die folgende harmonische Reihe rekursiv zu berechnen scheitern an meinem Algorithmus:
Harmonische Reihe: Summe von i bis n über alle (1/i)
also z.b. für n 4: (1/1)+(1/2)+(1/3)+(1/4)

Jedoch bringe ich es nicht hin dass dieser Wert rekursiv berechnet wird.

```
public class Harmonie {
	public static void main(String[] argv){
		System.out.println(berechnen(0,4,0));		
	}
	public static float berechnen(float i,float n,float sum){
		i++;
		if(n>i){
			sum = (1/i) + berechnen(i,n,sum);
		}
		return sum;		
	}
}
```

Beim Start wird für n ein wert von 4 übergeben. Ergebnis hier: 1,8333. Das wäre jedoch das richtige Ergebnis für n=3.
Wo liegt da mein Fehler?


----------



## Leroy42 (28. Feb 2006)

Du brichst die Rekursion einfach zu früh ab.

Eine andere Frage. Wieso schleppst du deine Zwischensumme und den Index mit dir herum?


```
double harmonisch(int n) {
    return n<1 ? 1 : 1.0 / n + harmonisch(n-1);
}
```

Oder muß die Berechnung unbedingt _vorwärts_ erfolgen?


----------



## 0001001 (28. Feb 2006)

Ach habs gelöst: war das if(n>=i).  aus dem > muss ein >= werden:

```
public class Harmonie {
	public static void main(String[] argv){
		System.out.println(berechnen(0,3,0));		
	}
	public static float berechnen(float i,float n,float sum){
		i++;
		if(n>=i){
			sum = (1/i) + berechnen(i,n,sum);
		}
		return sum;		
	}
}
```


----------



## 0001001 (28. Feb 2006)

Leroy42 hat gesagt.:
			
		

> Du brichst die Rekursion einfach zu früh ab.
> 
> Eine andere Frage. Wieso schleppst du deine Zwischensumme und den Index mit dir herum?
> 
> ...



Gute Frage! Ich seh schon du hast es ziemlich drauf. Leider kommt man als Anfänger nicht immer zur elegantesten Lösung sondern ist froh wenn man das Problem überhaupt rekursiv lösen kann.


----------



## Leroy42 (28. Feb 2006)

Sorry, sollte nicht herablassend rüberkommen.

Wollte dir nur eine Idee (für die Zukunft   ) geben.


----------



## Leroy42 (28. Feb 2006)

P.S.: Und ich sag' dir lieber nicht, wieviele Monate ich damals mit
C++ herumgekrebst habe, bis ich einigermaßen lauffähige Programme
zusammenfrickeln konnte


----------



## Bert Brenner (28. Feb 2006)

Vielleicht hilft dir dies um Leeroys Lösung besser zu verstehen:

```
double harmonisch(int n) {
  if (n>1)
    return 1d/n + harmonisch(n-1);
  else
    return 1;
}
```


----------



## 0001001 (28. Feb 2006)

@Leroy42 war auch nicht böse gemeint. Sorry wenns so rübergekommen ist, hab mich eigentlich sehr gefreut dass du mir geantwortet hast.

@Bert Brenner: Danke danach wollte ich eben fragen =)


----------



## Leroy42 (28. Feb 2006)

Noch ein Hinweis. Als Minimalist hat mich früher immer gekribbelt double Werte
zu benutzen wenn für meine Zwecke _float_ vollkommen ausreichend war.

Mittlerweile weiß ich allerdings, daß Java intern sowieso _immer_ mit
double-Genauigkeit rechnet und bei Benutzung von float-Werten diese
jedesmal in double umrechnen muß und umgekehrt.

Darum habe ich in der Beispiel-Methode statt float gleich double benutzt.


----------



## Bert Brenner (1. Mrz 2006)

Hast du mal eine Quellenangabe dazu?


----------



## Bleiglanz (2. Mrz 2006)

stimmt ja auch nicht, was glaubst du wohl warum in der 2D API alles doppelt vorhanden ist


----------

