# Addition rekursiv ohne Schleife



## xyZman (17. Nov 2010)

Hi.
2 Zahlen int a,b sollen addiert werden indem rekursiv 1 addiert oder subtrahiert wird. Ich darf keine Schleifen verwenden.

Wie gehe ich hier vor ? 
Fall 5 + 6 = 11
müsste er also  5 + 1 + 1 + 1 + 1 + 1 + 1 rechnen. Doch wie setzte ich es ohne Schleife um ?

Ich muss doch aufjedenfall 
return 1 anwenden am ende

lg
Flo


----------



## XHelp (17. Nov 2010)

```
5 + 6 ist:
(5+1) + 5
(5+1+1) + 4
(5+1+1+1) + 3
(5+1+1+1+1) + 2
(5+1+1+1+1+1) +1
```
Hilft dir den Ansatz weiter?
Ansonsten poste mal deine bisherigen Ergebnisse


----------



## xyZman (18. Nov 2010)

Das Programm funktioniert, trifft aber nicht auf die Aufgabenstellung oder ?
11+89 werden hier addiert

```
public class Addition {
 
    public static int succ(int n) {
        return n+1;
    }
 
    public static int pred(int n) {
        if (n == 0) throw new IllegalArgumentException();
        return predHelp(0,n);
    }
 
    private static int predHelp(int k, int n) {
        return succ(k) == n ? k : predHelp(succ(k),n);
    }
 
    public static int add(int a, int b) {
        return a == 0 ? b : add(pred(a), succ(b));
    }
 
    public static void main(String[] args) {
        System.out.println(add(11,89));
    }
 
}
```


----------



## Marco13 (18. Nov 2010)

Was soll daran nicht stimmen?


----------



## xyZman (18. Nov 2010)

Ich verstehe das 





> indem rekursiv 1 addiert oder subtrahiert wird


 nicht???:L


----------



## Andi_CH (18. Nov 2010)

Dann schreib mal in die rekusive Funktion ein sysout rein, dass dir ausgibt mit welchen Werten sie aufgerufen wird - dann sollte es dir klar werden ...


----------



## bygones (18. Nov 2010)

du verstehst den text nicht hast aber einen viel zu komplexen code ?....


```
private static int add(int i, int j) {
  if (j == 0 || i == 0) {
        return i + j;
  }

    return 1 + (add(i, j - 1));
}
```
mehr braucht man nicht


----------



## Marcinek (18. Nov 2010)

bygones hat gesagt.:


> du verstehst den text nicht hast aber einen viel zu komplexen code ?....
> 
> 
> ```
> ...



Ich würde vieleicht noch um es deutlicher zu machen die abbruchbedingung ein wenig umschreiben:


```
private static int add(int i, int j) {
  if (j == 0) {
        return i;
  }

    return 1 + (add(i, j - 1));
}
```


----------



## Marco13 (18. Nov 2010)

bygones hat gesagt.:


> du verstehst den text nicht hast aber einen viel zu komplexen code ?....
> ...
> mehr braucht man nicht



Wenn man die natürlichen Zahlen im puristisch-algebraischen Sinne definiert, gibt es eigentlich kein "+1" und erst recht kein "-1": In dem "Datentyp der Natürlichen Zahlen" (websuche "Peano-Axiome") gibt es eigentlich nur die Nachfolgerfunktion "succ".

Dass der Threadersteller entweder glaubt, dass hier nur Leute mit mieserablem Gedächtnis über längeren Zeitraum posten, oder er uns veräppeln will, sollte man vielleicht auch noch erwähnen: http://www.java-forum.org/java-basi...1-additions-mittels-rekursion.html#post581306


----------



## bygones (18. Nov 2010)

Marcinek hat gesagt.:


> Ich würde vieleicht noch um es deutlicher zu machen die abbruchbedingung ein wenig umschreiben:
> 
> 
> ```
> ...


dann hast du aber bei add(0,10000) - 10000 "sinnlose" rekursive aufrufe....


----------



## Marcinek (18. Nov 2010)

Ich denke das ist hier irrelevant


----------

