| 175 | |
| 176 | == Rekursion auf Arrays == |
| 177 | Bei der Rekursion auf Arrays wird ein Array als Parameter der rekursiven Methode verwendet. Die Verkleinerung des Problems erfolgt dadurch, dass in der Methode eine Operation mit der ersten (oder ggf. letzten) Zelle des Arrays durchgeführt wird und die Methode mit dem Rest des Arrays (das Array ohne die bereits bearbeitete Zelle) rekursiv aufgerufen wird. Rekursionsende ist, wenn alle Zellen des Arrays bearbeitet wurden. |
| 178 | |
| 179 | Dieser Mechanismus lässt sich auf zwei verschiedene Arten implementieren: Entweder liefert man stets den Index der aktuellen Zelle als zusätzlichen Parameter mit, oder man liefert stets eine um die aktuelle Zelle verkleinerte Kopie des Arrays mit. |
| 180 | |
| 181 | Der Nachteil der ersten Variante ist, dass man eine Wrapper-Methode benötigt, um den zusätzlichen Parameter zu verstecken, der Nachteil der zweiten Variante ist, dass stets eine Kopie des Arrays erzeugt werden muss, was eine teure Operation ist. |
| 182 | |
| 183 | {{{ |
| 184 | #!java |
| 185 | // mit Wrapper, Übergabe eines zusätzlichen Parameters |
| 186 | public static int summeRekursiv(int[] a, int pos) { |
| 187 | if (pos == a.length - 1) { |
| 188 | return a[pos]; |
| 189 | } |
| 190 | return a[pos] + summeRekursiv(a, pos + 1); |
| 191 | } |
| 192 | |
| 193 | // Wrappermethode für summeRekursiv |
| 194 | public static int summe(int[] a) { |
| 195 | return summeRekursiv(a, 0); |
| 196 | } |
| 197 | |
| 198 | // ohne Wrapper, mit Kopie des Arrays |
| 199 | public static int summe2(int[] a) { |
| 200 | if (a.length == 0) { |
| 201 | return 0; |
| 202 | } |
| 203 | return a[0] + summe2(Arrays.copyOfRange(a, 1, a.length)); |
| 204 | } |
| 205 | |
| 206 | }}} |