# Rekursion und Schleifen



## kilopack15 (15. Nov 2016)

Hallo Leute!
Ich habe zwei Fragen, die mir gerade beim Programmieren gekommen sind.
1.) Eine Frage zur Rekursion. habe ich es richtig verstanden, dass man bei der Rekursion zunächst "Hilfsmethoden" erstellt, die die Aufgabe der "Hauptmethode" stückelt, um dann in der Hauptmethode das Ergebnis durch Aufruf der Hilfsmethoden zu bekommen? Beispiel:

```
hilfsmethode1(){
}
hilfsmethode2(){
}
hilfsmethode3(){
}

hauptmethode(){
ergebnis= hilfsmethode1 + hilfsmethode2 * hilfsmethode3;
}
```
2.)
Ich habe eine Checker-Methode, die entweder den Wert true oder false ausgibt. Solange sie true ist, soll eine bestimmte Schleife ausgeführt werden. Diese Schleife könnte aber den Wert der Checkermethode in false ändern und soll dann zum Abbruch der Schleife führen.
Ich dachte zuerst an eine do-while Schleife,also

```
do  x=1+1;
       i++;
while(Checkermethode == true)
```
Allerdings habe ich da zwei Anwendungen im "do"-Teil. Das funktioniert bei mir nicht. Gibt es da einen Weg?


----------



## Robat (15. Nov 2016)

kilopack15 hat gesagt.:


> *do*  x=1+1;
> i++;
> *while*(Checkermethode == *true*)



wie wäre es mit geschweiften Klammern? 
{

}

BTW:
Es reicht, wenn du 

```
do {
   // ..
}while(checkMethode());
```
schreibst


----------



## neoexpert (15. Nov 2016)

Für die Rekursion braucht man keine Hilfsmethoden.
das hier ist die einfachste Rekursion:

```
public void f(){
f();
}
```


----------



## prise1993 (15. Nov 2016)

Eine Rekursion zerlegt das Problem solange bis Sie zu einen möglichst einfachen Fall kommt.
Ein gutes Beispiel ist die Fakultät rekursiv:

```
publi static int fac(int n){
    if (n == 1){
        return 1;
    } else {
        return n * fac(n-1);
    }
}
```
Die Rekursion ist hier definiert durch:

```
wenn n=1 n!= 1
wenn n > 1 n! = n*(n-1)!
```
Der einfachste Fall ist n = 1


----------



## Flown (15. Nov 2016)

Ich hab vor Ewigkeiten ein Tutorial über Rekursion geschrieben. Zu finden ist das in den FAQs - HIER.


----------



## Flown (15. Nov 2016)

neoexpert hat gesagt.:


> Für die Rekursion braucht man keine Hilfsmethoden.
> das hier ist die einfachste Rekursion:
> 
> ```
> ...


Das hier ist die einfachste *Endlos*rekursion. Eines der wichtigsten Teile, ist eine (oder mehrere) Abbruchbedingung.


----------



## neoexpert (15. Nov 2016)

```
public long fac(long n){
    if (n==1||n==0)return 1;
    return n * fac(n-1);
}
//Finde ich übersichtlicher.
```


----------



## prise1993 (15. Nov 2016)

neoexpert hat gesagt.:


> ```
> public long fac(long n){
> if (n == 1||n==0)return 1;
> return n * fac(n-1);
> ...


Geschmakssache


----------



## Thallius (15. Nov 2016)

neoexpert hat gesagt.:


> ```
> public long fac(long n){
> if (n==1||n==0)return 1;
> return n * fac(n-1);
> ...



Wenn schon dann gleich


```
return (n<=1) ? 1 : n*fac(n-1);
```

GRuß

Claus


----------



## neoexpert (15. Nov 2016)

Thallius hat gesagt.:


> Wenn schon dann gleich
> 
> 
> ```
> ...


Ah wie konnte ich nur: stimmt. Allerdings Fakultät von negativen Werten lässt sich so nicht berechnen.
Also:

```
public long fac(long n){
return (n==1||n==0)?1:n*fac(n-1);
}
```


----------



## InfectedBytes (15. Nov 2016)

neoexpert hat gesagt.:


> Ah wie konnte ich nur: stimmt. Allerdings Fakultät von negativen Werten lässt sich so nicht berechnen.
> Also:
> 
> ```
> ...


Wenn man bei dir negative Zahlen rein wirft gibt's nen stackoverlow, das macht es nicht besser^^


----------



## Thallius (15. Nov 2016)

neoexpert hat gesagt.:


> Ah wie konnte ich nur: stimmt. Allerdings Fakultät von negativen Werten lässt sich so nicht berechnen.
> Also:
> 
> ```
> ...



Es gibt keine Fakultät von negativen Zahlen....


----------



## neoexpert (15. Nov 2016)

InfectedBytes hat gesagt.:


> Wenn man bei dir negative Zahlen rein wirft gibt's nen stackoverlow, das macht es nicht besser^^


Doch: es ist besser eine Exception zu kriegen als falsche Berechnung.


----------



## InfectedBytes (15. Nov 2016)

neoexpert hat gesagt.:


> Doch: es ist besser eine Exception zu kriegen als falsche Berechnung.


Aber doch keine Stackoverflow Exception!
Dafür macht man eine separate Abfrage und wirft selbst *sofort *ne (Arithmetic)Exception! Zu warten bis der Stack überläuft ist mit das schlimmste was man machen kann.


----------



## neoexpert (15. Nov 2016)

Thallius hat gesagt.:


> Es gibt keine Fakultät von negativen Zahlen....


Doch. Ausser von Ganzen negativen Zahlen. Tipp im google Taschenrechner (-0.5)!
ein.


----------



## neoexpert (15. Nov 2016)

InfectedBytes hat gesagt.:


> Aber doch keine Stackoverflow Exception!
> Dafür macht man eine separate Abfrage und wirft selbst *sofort *ne (Arithmetic)Exception! Zu warten bis der Stack überläuft ist mit das schlimmste was man machen kann.


Joa.
Edit: es ging ja um Übersichtkeitkeit. Aber selbst Stack-Überlauf-Exception kann abhängig vom Anwendungs- Fall besser sein, als irgendwo einen falschen Wert ohne eine Meldung zu haben.


----------



## InfectedBytes (15. Nov 2016)

neoexpert hat gesagt.:


> Doch. Ausser von Ganzen negativen Zahlen. Tipp im google Taschenrechner (-0.5)!
> ein.


Du benutzt aber nur ganze Zahlen (long kann keine Kommazahlen) und das ändert nichts an der Tatsache dass man trotzdem selber eine ordentliche Exception werfen sollte.

Und außerdem ist die Fakultätsfunktion für negative oder nicht ganze Zahlen eben nicht definiert.

edit:
und das mit dem google Taschenrechner ist ein sehr schlechtes Argument, da dieser dir auch -2! "ausrechnet"


----------



## neoexpert (15. Nov 2016)

InfectedBytes hat gesagt.:


> Du benutzt aber nur ganze Zahlen (long kann keine Kommazahlen) und das ändert nichts an der Tatsache dass man trotzdem selber eine ordentliche Exception werfen sollte.
> 
> Und außerdem ist die Fakultätsfunktion für negative oder nicht ganze Zahlen eben nicht definiert.
> 
> ...


Falsch, da: -2!=-(2!)
Ausserdem (ist schon öfter Vorgekommen) könntest du die Attribute wie "sehr schlecht" seltener verwenden?


----------



## InfectedBytes (15. Nov 2016)

neoexpert hat gesagt.:


> Falsch, da: -2!=-(2!)
> Ausserdem (ist schon öfter Vorgekommen) könntest du die Attribute wie "sehr schlecht" seltener verwenden?


Hab ich glatt die Präzedenz ignoriert, ändert aber nichts am Rest. Schau dir nen beliebiges Mathe buch oder den Wikipedia artikel an.


----------



## neoexpert (15. Nov 2016)

Du meinst also -3! != -6 ?
Das ist nicht richtig. ! hat höhere Priorität als "-"
Edit: oben Korrigiert


----------



## InfectedBytes (15. Nov 2016)

neoexpert hat gesagt.:


> Das ist nicht richtig. ! hat höhere Priorität als "-"


Das sag ich doch:


InfectedBytes hat gesagt.:


> Hab ich glatt die Präzedenz ignoriert


----------



## neoexpert (15. Nov 2016)

InfectedBytes hat gesagt.:


> Undaußerdem ist die Fakultätsfunktion für negative oder nicht ganze Zahlen


Für  reele Zahlen ausser den negativen ganzen Zahlen.
Also D= |R\{|Z-}


----------



## InfectedBytes (15. Nov 2016)

Einfach Nein...
Die Fakultätsfunktion ist nur für Natürliche Zahlen > 0 definiert, schau einfach in ein beliebiges Mathe Buch oder eben Wikipedia^^ https://de.wikipedia.org/wiki/Fakultät_(Mathematik)
Einfach mal kurz durchlesen und schon ist alles geklärt.

Für negative Zahlen gibt es "Erweiterungen" der Fakultät, z.B. die Gamma Funktion, aber Erweiterung != Original, also Gamma Funktion != Fakultätsfunktion.


----------



## neoexpert (15. Nov 2016)

Ja ok. Meine Definitionsmenge ist halt für Google oder Wolfram Alpha gültig.


----------



## InfectedBytes (15. Nov 2016)

neoexpert hat gesagt.:


> Ja ok. Meine Definitionsmenge ist halt für Google oder Wolfram Alpha gültig.


xD
Wolframalpha sagt dir auch das er die Gamma Funktion benutzt und nicht die Fakultät.
Du darfst halt nur nicht mit der ersten Zeile aufhören zu lesen.

edit: Sorry an den TE für die ganzen (unnötigen) Beiträge, aber jetzt ist ja endlich geklärt wie die Fakultät definiert ist.^^


----------



## neoexpert (15. Nov 2016)

Schon krass, denkt man was gutes dabei und vergisst, dass Gamma nur eine Erweiterung ist. Ich hätte Fakultät auch für R ausser Z(-) definiert. Naja es liegt wohl an der Einfachheit von Fakultät, dass man es nicht mit Gamma (um 1 verschoben) gleichsetzt.
Und da war noch ein Edit. hab vergessen zu benachrichtigen:
Edit: es ging ja um Übersichtkeitkeit. Aber selbst Stack-Überlauf-Exception kann abhängig vom Anwendungs- Fall besser sein, als irgendwo einen falschen Wert ohne einer Meldung zu haben.


----------



## InfectedBytes (15. Nov 2016)

neoexpert hat gesagt.:


> Schon krass, denkt man was gutes dabei und vergisst, dass Gamma nur eine Erweiterung ist. Ich hätte Fakultät auch für R ausser Z(-) definiert. Naja es liegt wohl an der Einfachheit von Fakultät, dass man es nicht mit Gamma (um 1 verschoben) gleichsetzt.
> Und da war noch ein Edit hab vergessen zu benachrichtigen:
> Edit: es ging ja um Übersichtkeitkeit. Aber selbst Stack-Überlauf-Exception kann abhängig vom Anwendungs- Fall besser sein, als irgendwo einen falschen Wert ohne einer Meldung zu haben.


Die Gamma Funktion ist nicht nur für R\Z- definiert...Die Gamma Funktion ist für komplexe Zahlen mit positivem Real Teil als simples Integral definiert. Gibt auch noch weitere Darstellungen


----------



## neoexpert (15. Nov 2016)

InfectedBytes hat gesagt.:


> Die Gamma Funktion ist nicht nur für R\Z- definiert...Die Gamma Funktion ist für komplexe Zahlen mit positivem Real Teil als simples Integral definiert. Gibt auch noch weitere Darstellungen


Das ist cool. Wir sind von Thema rekursiv abgewichen.


----------

