# Iterativ <-> Rekursiv in Java



## iterarek (13. Mai 2006)

Hallo,


kann jemand mir den Unterschied zwischen Rekursiv und Iterativ (explizit in Java) erklären?

Mit ist die Praxis nicht klar. Woran erkenne ich ob ein Programm iterativ ist oder Rekursiv.
Ich habe gelsen, dass iterativ meistens (oder immer?) eine Schleife hat.

Ist das das einzige Erkennungsmerkmal?


----------



## SnooP (13. Mai 2006)

Eine Rekursion spielt sich immer innerhalb einer Methode ab (oder auch übere mehrere). Das Erkennungsmerkmal ist, dass innerhalb der Methode diese sich selbst wieder aufruft, z.B. Methode doSomething(int x) hat irgendwo in ihrem Rumpf den Aufruf: doSomething(17); ... dadurch hat man die Möglichkeit quasi eine Art Schleife oder Iteration zu erzeugen.. es wird also ein Codeteil mehrfach ausgeführt... zumeist ändert sich der Parameter (die 17) für den rekursiven Aufruf immer, so dass irgendwann ein Wert erreicht wird, bei dem die Rekursion abgebrochen werden kann (Abbruchbedingung)... hat die rekursive Methode einen Rückgabewert, dann steht vor dem rekursiven Aufruf noch ein return doSomething() damit am Ende alle Ergebnisse, also alle Rückgabewerte entsprechend zusammengebaut zurückgegeben werden können...
Iterativ verzichtet auf diese rekursiven Aufrufe und man hat als Iterationsmöglichkeiten alle Arten von Schleifen: for, while, do. Allerdings können beide Möglichkeiten auch kombiniert werden, es spricht also nix dagegen innerhalb einer rekursiven Methode eine for-Schleife zu verwenden... - sprich, du musst in einem Programm nur die rekursiven Aufrufe finden, um festzustellen, ist das jetzt rekursiv oder nicht...
und zusätzlich muss man noch bedenken: rekursiv geht schiev


----------



## Leroy42 (13. Mai 2006)

Iterative Funktionen berechnen etwas _in einer Schleife_.
Rekursive Funktionen berechnen etwas berechnen etwas durch Aufruf
von sich selbst (direkt oder über eine andere Funktion).


Standardbeispiel ist die Fakultätsfunktion:


```
Iterativ:
fakIter(n) := produkt(i=1, n, i);

Rekursiv:
fakRek(n) := 1 für n=0
fakRek(n) := n*fakRek(n-1) für n>0

int fakIter(int n) {
  int fak = 1;
  for (int i = 1; i <= n; i++)
    fak := fak * i;
  return fak;
}

int fakRek(int n) {
  if (n==0)
    return 1;
  else
    return n*fak(n-1);
}
```


----------



## Leroy42 (13. Mai 2006)

SnooP hat gesagt.:
			
		

> rekursiv geht schiev


Das kann man nun wirklich nicht so stehen lassen, obwohl es ein nettes Wortspiel ist.
Sauber analysiert und gecodet geht nix schief.

(Hoffentlich ruft keiner meine fakRek-Funktion mit einem negativen Wert auf)


----------



## SnooP (13. Mai 2006)

das war auch nur nen lustiger Spruch aus den Anfängen meines Studiums... häufig haben gerade Anfänger ihre Probleme mit Rekursionen und stackOverflows etc. - daher der Spruch - natürlich ist der nicht in gänze ernst gemeint 

Denn eigentlich: To iterate is human - to recurse is divine


----------



## Leroy42 (13. Mai 2006)

Schon besser  

Kommt der Sache näher


----------



## bygones (14. Mai 2006)

um Rekursion zu verstehen muss man rekursion verstehen


----------



## iterarek (14. Mai 2006)

Hi!

Danke für eure vielen Antworten, ich glaube ich bin jetzt schon schlauer geworden was iterativ und rekursiv angeht. Schade dass einem das an der Uni nicht so ausführlich erläutert wird


----------



## Wikinator (14. Mai 2006)

da muss ich auch noch den Rekursionswitz bringen:

Im Wörterbuch unter "Rekursiv" steht:
_siehe rekursiv_


----------



## byte (14. Mai 2006)

iterarek hat gesagt.:
			
		

> Danke für eure vielen Antworten, ich glaube ich bin jetzt schon schlauer geworden was iterativ und rekursiv angeht. Schade dass einem das an der Uni nicht so ausführlich erläutert wird



An der Uni wird Dir halt nicht alles vorgekaut wie in der Schule. Da musste im Zweifelsfall auch mal selbst nachschlagen.


----------



## AlArenal (14. Mai 2006)

byto hat gesagt.:
			
		

> iterarek hat gesagt.:
> 
> 
> 
> ...



Richtig. Eine der Hautpaufgaben eines Studenten ist es, Lernen zu lernen.


----------



## SnooP (15. Mai 2006)

AlArenal hat gesagt.:
			
		

> Richtig. Eine der Hautpaufgaben eines Studenten ist es, Lernen zu lernen.


und schade eigentlich, dass das einem nicht schon in der Schule beigebracht wird... aber nein - das meiste was man da lernt ist Schwachsinn


----------

