# Rekursion programmieren



## Maultäschle (24. Jan 2017)

Hello,

ich würde gerne diese Funktion rekursiv programmieren:
f(x)={ x-15, x>150
           f(f(x-16)) sonst}

Ich hätte daraus eine Funktion mit if und Else gemacht, aber ich soll die rekursiv programmieren und da hab ich keine Ahnung, wie ich vorgehen soll...


----------



## JCODA (25. Jan 2017)

versuch es mal mit if else, und poste deinen Code. 
Du musst sehr wahrscheinlich if/else in der rekursiven Version benutzen ...


----------



## Meniskusschaden (25. Jan 2017)

Vielleicht habe ich da noch einen Denkfehler, aber mir leuchtet der Sinn der Aufgabe nicht ein. Entweder x ist größer als 150. Dann wird 15 subtrahiert und man ist fertig.
Oder x ist kleiner/gleich 150. Dann wird das Funktionsargument immer kleiner und es gibt es eine theoretisch endlose Rekursion, die nur dadurch beendet wird, dass es entweder zum Stapelüberlauf kommt, oder dadurch, dass das Funktionsargument wegen Überschreitung des Wertebereichs doch wieder positiv wird.


----------



## Maultäschle (25. Jan 2017)

Um ehrlich zu sein, hab ich den zweiten Teil selbst nicht verstanden


----------



## Maultäschle (25. Jan 2017)

Meine bisherigen Überlegungen


----------



## Meniskusschaden (25. Jan 2017)

Wieso denn jetzt x-16 bei x>150 und sonst x+12? Bist du sicher, dass du hier die exakte Aufgabenstellung gepostet hast?


----------



## Maultäschle (25. Jan 2017)

Sorry, hätte mich vertippt. Statt 16 eine 15 und statt 12 eine 16


----------



## Meniskusschaden (25. Jan 2017)

Hm, bezieht sich das jetzt auf die Aufgabenstellung oder den Lösungsansatz? Für mich ergibt beides keinen Sinn. Ist die Aufgabenstellung nun korrekt oder nicht?


----------



## Maultäschle (25. Jan 2017)

Also korrekt ist sie, aber anscheinend hab ich Schwachsinn produziert. Würde mich über Ansätze freuen


----------



## Meniskusschaden (25. Jan 2017)

Wenn man deine Korrekturen aus Post #7 einbaut, sieht deine Lösung also wie folgt aus:

```
private static int berechne(int x) {
        int ergebnis;
        if (x > 150) {
            ergebnis = x-15;
        } else {
            ergebnis = x+16;
        }
        return ergebnis;
    }
```
Der if-Zweig der Bedingung entspricht der Aufgabenstellung. Aber wie kommst du im else-Zweig auf `x+16`? In der Aufgabenstellung steht doch etwas anderes, nämlich `x-16`. Ausserdem soll nicht x-16 zurück geliefert werden, sondern der Rückgabewert des Methodensaufrufes des Rückgabewertes des Methodenaufrufes `berechne(x-16)`. Dann müsste aber meine Argumentation aus Post #3 zum Tragen kommen. Ich glaube deshalb immer noch, dass die Aufgabenstellung fehlerhaft ist.


----------



## Meniskusschaden (25. Jan 2017)

Noch eine Ergänzung, weil meine Formulierung im vorigen Post vielleicht etwas mißlungen ist: Im else-Zweig soll nicht `x-16` berechnet werden und auch nicht `f(x-16)`, sondern `f(f(x-16))`.


----------



## Maultäschle (25. Jan 2017)

Sorry, es war
f(x)={ x-15, x>150
f(f(x+16)), sonst


----------



## Maultäschle (25. Jan 2017)

Also muss für den Else-Zweig folgendes gelten?
else{
ergebnis = berechne (x+16);
}
return ergebnis;


----------



## Meniskusschaden (25. Jan 2017)

Fast. Das würde f(x+16) berechnen. Gefordert ist aber f(f(x+16)).


----------



## Maultäschle (25. Jan 2017)

Soll der Methodenaufruf dann zweimal erfolgen? Und wie setze ich das um?


----------



## Joose (25. Jan 2017)

Wie wäre es mit `berechne(berechne(x+16))`


----------

