Auf Thema antworten

Das war zu kompliziert von mir gedacht. Hier dürfte ein Stack reichen.


Nehmen wir mal:

[code=Java]

public int f(int x) {

    if (x <= 0) { return 0; }

    return x + f(x-1) + f(x/2);

}

[/code]


Das lässt sich schreiben als:

[code=Java]

public int f(int x) {

    if (x <= 0) { return 0; }

    int sum = x;

    sum += f(x-1); // erster rekursiver Aufruf

    sum += f(x/2); // zweiter rekursiver Aufruf

    return sum;

}

[/code]


Da die Reihenolge der Summanden keine Rolle spielt, kann man hier einfach die Werte auf den Stack legen:

[code=Java]

public int f(int x) {

    int sum = 0;

    Stack<Integer> stack = new Stack<>();

    stack.push(x);

    while (!stack.isEmpty()) {

        int cx = stack.pop();

        sum += cx;

        if (cx > 1) {             

             stack.push(cx/2);

        }

        if (cx > 0) {

             stack.push(cx-1);

        }

    }

    return sum;

}

[/code]

Ansonsten müsste man cx-1 oben und cx/2 unten in den Stack einfügen, dann sollte auch die Reihenfolge passen.



Oben