Rekursion Klausur Aufgabe

johny96wet

Neues Mitglied
Implementieren Sie eine iterative Klassenmethode filter_iter, die einen int Wert i und ein int-Array a übergeben bekommt, und ein int-Array zurückliefert, dass alle Zahlen von 0 bis einschließlich i enthält, die ganzzahlig durch eine Zahl aus dem Array a teilbar sind. Zerlegen Sie Ihre Lösung in sinnvolle Untermethoden. Bsp.: filter_iter(10, new int[]{3,4}) liefert {3,4,6,8,9} zurück

Implementieren Sie eine rekursive Klassenmethode filter_rec, die die gleiche Funktion wie filter_iter errechnet aber komplett ohne Schleifen auskommt. Zerlegen Sie Ihre Lösung in sinnvolle Untermethoden.


Wie würdet ihr sie rekursiv lösen? Für die Iterative Form habe ich eine Lösung aber ich weiß jetzt nicht wie ich es rekursiv implementieren soll.

Iterative Lösung:
static void iter(int i,int[] array) {
for (int j = 0; j <array.length; j++) {
int k = i;
while(k>0) {
if(k%array[j]==0) {
System.out.println(k);
}
--k;
}
}

}
 
Für die Iterative Form habe ich eine Lösung
Nein. Deine Methode gibt nichts zurück.

Bsp.: filter_iter(10, new int[]{3,4}) liefert {3,4,6,8,9} zurück
Das Beispiel ist falsch, da jede Zahl Teiler von 0 ist.

Rekursiver Ansatz mit folgender Überlegung: Wir beginnen mit einem leeren Array und müssen an dieses ein i anhängen, wenn die Bedingung erfüllt ist.

Ungetestet:

Java:
static int[] filter_rec(int i, int[] arr) {
    if (i < 0) {
        return new int[0];
    }
    int[] kleinereZahlen = filter_rec(i-1, arr);
    if (teilbar(i, arr, 0)) {
        return fuegeAn(kleinereZahlen, i);
    } else {
        return kleinereZahlen;
    }
}

static boolean teilbar(int i, int[] arr, int ix) {
    if (ix == arr.length) { return false; }
    if (i % arr[zahl] == 0) {
        return true;
    }
    return teilbar(i, arr, ix+1);
}

static int[] fuegeAn(int[] arr, int wert) {
    int[] neuesArray = new int[arr.length+1]; 
    kopiere(arr, neuesArray, 0);
    neuesArray[arr.length] = wert;
    return neuesArray;
}

static void kopiere(int[] src, int[] dest, int ix) {
    if (ix == src.length) { return; }
    dest[ix] = src[ix];
    kopiere(src, dest, ix+1);
}
 

Zurück
Oben