# Array umkehen, iterativ und rekursiv



## pay (16. Mrz 2012)

hey...^^ Mir wurde als Schulaufgabe aufgetragen, ein Programm zu schreiben, dass den Inhalt eines Arrays umkehrt (d.h., dass das erste und das letzte Element vertauscht werden, das zweite und das zweitletzte etc.). Und zwar soll dies einmal iterativ und einmal rekursiv verwirklicht werden. Die iterative Variante habe ich folgendermaßen gelöst:


```
import java.util.Scanner;

class innerhalbeinesarraysvertauschen {
  
  public static void main(String[] args) {
    
    Scanner scanner = new Scanner(System.in);
    System.out.println("Bitte geben Sie die gewünschte Größe des Feldes an.");
    int n = scanner.nextInt();
    int[] array = new int[n];
    int x = 0;
    while (x < n) {
      System.out.println("Belegen Sie " + x + " bitte mit einem Wert.");
      array [x] = scanner.nextInt();
      x++;
    }
    arrayumkehren(array);
  }
  
  public static void arrayumkehren(int[] array) {
    int left = 0;
    int right = array.length - 1;
    int temp;
while (left < right) {
      temp = array[left];
      array[left] = array[right];
      array[right] = temp;
      left++;
      right--;
    }
 for (int i = 0; i < array.length; i++) {
      System.out.println(array[i]);
    }
  }
}
```

Bei der iterativen Variante dürften keine größeren Fehler vorhanden sein. Die rekursive Variante bereitet mir aber noch Schwierigkeiten. Hier mein Versuch:


```
import java.util.Scanner;

class innerhalbeinesarraysvertauschenrek {
  
  public static void main(String[] args) {
    
    Scanner scanner = new Scanner(System.in);
    System.out.println("Bitte geben Sie die gewünschte Größe des Feldes an.");
    int n = scanner.nextInt();
    int[] array = new int[n];
    int x = 0;
    while (x < n) {
      System.out.println("Belegen Sie " + x + " bitte mit einem Wert.");
      array [x] = scanner.nextInt();
      x++;
    }
    
    
    
    array = arrayumkehren(array, 0, array.length - 1, 0);
    
    for (int h = 0; h < array.length; h++) {
      System.out.print(array[h]);
    }
  }
  public static int[] arrayumkehren(int[] array, int left, int right, int temp) {
    
    if (left < right) {
      temp = array[left];
      array[left] = array[right];
      array[right] = temp;
      
      return arrayumkehren(array, left++, right--, temp);
    }
    
    else {
    return array;
    }
  }
}
```

Mir ist nicht ganz klar, wo der Fehler sein könnte...auch nach diversen Versuchen nicht. Würde mich freuen, wenn ihr mir helfen könntet. Vielen Dank

Gruß
pay


----------



## XHelp (16. Mrz 2012)

Du solltest vlt mal "Fehler" genauer beschreiben.
Bei dir wir immer wieder die selben Werte in left und right übergeben. Entweder solltest du 
	
	
	
	





```
++left
```
 und 
	
	
	
	





```
--right
```
 verwenden, oder (was sinnvoller ist) 
	
	
	
	





```
left+1
```


```
right-1
```


----------



## pay (16. Mrz 2012)

Danke erstmal für die Hilfe...zu deinem Hinweis: Ich veränder doch left und right durch left++ und right--...?


----------



## XHelp (16. Mrz 2012)

Nein, tust du nicht: Galileo Computing :: Java ist auch eine Insel - 2 Imperative Sprachkonzepte
Teste es doch mal. Lass dir left und right ausgeben.


----------



## Landei (16. Mrz 2012)

XHelp hat gesagt.:


> Nein, tust du nicht: Galileo Computing :: Java ist auch eine Insel - 2 Imperative Sprachkonzepte
> Teste es doch mal. Lass dir left und right ausgeben.



Genaugenommen werden 
	
	
	
	





```
left
```
 und 
	
	
	
	





```
right
```
schon verändert, aber erst _nachdem _die vorherigen Werte als Methodenargumente übergeben wurden.


----------



## XHelp (16. Mrz 2012)

@Landei, hast natürlich recht. Ich habe das so in etwa angefangen zu tippen, aber dann fand ich die Erklärung zu verwirrend, deswegen habe ich mich für ein vereinfachtes, aber verfälschtes "tust du nicht" entschieden.


----------



## pay (17. Mrz 2012)

Vielen Dank euch beiden...mir war bis gestern nicht bewusst, dass zwischen x++ und ++x ein Unterschied besteht; haben wir im Unterricht immer synonym verwendet, ohne auf Unterschiede einzugehen. Danke vielmals.

Gruß
pay


----------

