Java frage programmieren?

4 Antworten

Solche Aufgaben finde ich immer ziemlich eigenartig. Normalerweise würde man einfach zählen, wie oft der Wert im Array vorkommt und dann prüfen, ob der Wert gerade oder ungerade ist.

public static boolean evenCount(int num, int[] arr) {
	return Arrays.stream(arr).filter(i->i==num).count() % 2 == 0;
}

oder

public static boolean evenCount(int num, int[] arr) {
	return (Arrays.stream(arr).filter(i->i==num).count() & 1) == 0;
}

Wenn man es rekursiv lösen soll, ist es deutlich schwieriger. Ich hab jetzt eine Funktion gebaut, die rekursiv die Anzahl der Vorkommnisse zählt und eine Funktion, die halt prüft, ob die Anzahl gerade ist oder nicht.

public static boolean evenCount(int num, int[] arr) {
	return countOccurences(num, arr, 0) % 2 == 0;
}

public static int countOccurences(int num, int[] arr, int index) {
	if (index >= arr.length) {
		return 0;
	} else {
		return countOccurences(num, arr, index+1) + (arr[index] == num ? 1:0);
	}
}
public class Main {

    public static void main(String[] args) {
        int[] array = { 2, 4, 3, 2 };
        System.out.println(occoursEven(2, array));
    }

    private static boolean occoursEven(int x, int[] array) {

        int amount = 0;// zähle wie oft die Zahl vorkommt
        for (int number : array)// gehe alle elemente durch
            if (number == x)
                amount++;

        return amount % 2 == 0;// modulo operator gibt den Rest zurück. Wenn die Zahl durch 2 teilbar ist also
                                // gerade ist der Rest 0. ACHTUNG wenn x nicht in array ist das Ergbenis auch
                                // true

    }

}

Danke dir! Leider hatte ich vergessen zu erwähnen, das ich das Problem nicht iterativ lösen soll, sondern rekursiv.

0

Hey,

als erstes solltest Du damit beginnen diese Methode zu erstellen:

public boolean deineMethode() { }

Sollte soweit verständlich sein, um die Parameter mit in der Methode zu übergeben, änderst Du diese nun folgendermaßen ab:

public boolean deineMethode(int n, int[] array) { }

n ist dabei die Zahl, die gesucht wird. array ist das Array, in dem die Zahl gesucht werden soll. Soweit so gut, nun die ersten Schritte der Methode.

Beginne damit, dass Du schaust, wie oft n im Array vorhanden ist:

public boolean deineMethode(int n, int[] array) {
  int anzahl = 0;
  for (int i = 0; i < array.length; i++) {
    if (i == n) {
      anzahl++;
    }
  }  
}

anzahl gibt nun an, wie oft deine Zahl vorhanden ist. Falls Du dich bereits mit for-each Schleifen auskennst, kannst Du diese natürlich auch verwenden. :)

So, nun zum Abschluss musst Du noch schauen, ob die Zahl gerade oder ungerade ist. Dementsprechend wird dann der return Wert aussehen:

public boolean deineMethode(int n, int[] array) {
  int anzahl = 0;
  for (int i = 0; i < array.length; i++) {
    if (i == n) {
      anzahl++;
    }
  }

  return anzahl % 2 == 0;
}

Das return mag vielleicht etwas kompliziert wirken, ist es aber gar nicht. Falls Du dich damit nicht weiter auskennst, das %-Zeichen ist der sogenannte Modulo-Operator. Was dieser macht ist ganz einfach: Er teilt die erste Zahl durch die Zweite (also quasi wie eine ganz normale Division (/)). Nun gibt er Dir aber nicht das Ergebnis dieser Divison zurück, sondern den Rest, der sich nicht gerade teilen lässt (so wie man es bereits in der Grundschule gelernt hat).

Beispiele:
- 2 % 2 = 0 (2 / 2 = 1, also kein Rest)
- 4 % 2 = 0 (4 / 2 = 2, also kein Rest)
- 5 % 2 = 1 (5 / 2 = 2,5, nicht gerade teilbar, also hast du 2x die Zwei und eins (1) bleibt über).

Wie wir wissen sind alle geraden Zahlen durch 2 teilbar, dementsprechend überprüft anzahl % 2 == 0, ob der Rest von der Division anzahl / 2 0 ist (also die Division ohne einen Rest glatt aufgeht).

LG :)

Woher ich das weiß:Hobby – Hobby-Entwickler in diversen Sprachen seit 2017

Kann man das auch Rekursiv erstellen? Also ohne schleifen. Ich bedanke mich schon mal im Voraus.

0
@Wilan20

Hey. Rekursiv funktioniert das natürlich auch, wusste jedoch nicht, dass das ganze rekursiv gelöst werden soll.

Rekursiv bedeutet, dass Du innerhalb einer Methode, diese Methode aufrufst. Also quasi als würdest Du dich selbst anrufen wollen. Rekursive Funktionen (Methoden) sind sehr hilfreich in der Programmierung, jedoch muss man etwas aufpassen, da sonst auch mal leicht eine unendliche Rekursion entstehen kann, die einen StackOverflowError herbeiruft.

Aber zurück zu deinem Problem, ich habe mich jetzt hier für eine Variante entschieden, die komplett auf Parametern basiert. Du könntest jedoch auch einzelne Variablen als Klassenvariablen speichern:

public boolean deineMethode(int n, int index, int count, int[] array) {
  if (array.length - 1 != index) {
    if (array[index] == n) {
      count++;
    }
    return deineMethode(n, index + 1, count);
  }

  return count % 2 == 0;
}

Sieht etwas komplexer aus, ist aber auch nicht viel schwerer. Du hast nun zwei zusätzliche Parameter, index und count. index ist der aktuelle index im array, damit die Methode auch weiß, an welcher Stelle sie als nächstes zu agieren hat. count ist die Anzahl der bereits gefunden Zahlen.

Das mit den Klassenvariablen habe ich eben gesagt, weil es theoretisch unnötig ist n immer wieder neu zu übergeben, wenn n immer gleich bleibt. Da das aber nicht zwangsweise der Fall ist, habe ich n jetzt als Parameter dabei gelassen.

Hoffe das behebt Dein Problem.

LG :)

1
@LocalFlow

Danke dir erstmal leider habe ich halt nur die zwei Parameter gegeben.

0
@Wilan20

Mein Gott, bitte auch einmal selber nachdenken !

Er hat Dir hier alles super erklärt zweifach serviert und dann kommt solch eine Antwort.

Da kann ich mich jedes Mal drüber aufregen.

Du sollst das Programmieren lernen und reine Anschreiberei bringt Dir nichts. Jeder nutzt heutzutage das Internet, warum nicht einfach die Aufgabe auseinander nehmen, nach den Teil - Problemen Googlen und alle kleinen Puzzleteile danach zusammensetzen?

Klar, dafür benötigst Du eventuell etwas länger, wenn Du jetzt anfangen würdest alles vergangene aufzuarbeiten. Dann verstehst Du es aber.

Mit ein wenig eigener Recherche und minimalem Vorwissen ist Dein Sachverhalt für einen Anfänger in unter einer Stunde zu lösen!

Ich will damit nicht sagen, dass Du hier nicht fragen darfst, nur sieht man deinerseits absolut keine Bemühungen selber das Problem zu lösen. So etwas verdient eigentlich gar keine so tollen Antworten wie hier geliefert.

Wenn dann auch noch eine Musterlösung auf dem Tablett serviert wird, diese allerdings nicht zu 100% Deiner benötigten Lösung entspricht wird Klappe zu gemacht?

Ran setzen, verstehen und dann auf Deinen Fall anpassen!

Gutefrage ist da, um spezifische Fragen zu klären und nicht, um komplette Hausarbeiten gelöst zu bekommen.

Bitte merke Dir:

Wenn Du etwas nicht verstehst oder nicht weißt, wie Du es lösen sollst, dann probiere erst Dir selber zu helfen durch Literatur oder Suchmaschine. Wenn das alles nach einer längeren Zeit erfolglos bleibt, dann kannst Du es in Erwägung ziehen, nachzufragen. Aber bitte, zeige etwas Eigeninitiative!

Schönen Abend!

0
@Wilan20

Hey,

um darauf einzugehen, du hast zwei Werte initiell gegeben, das ist korrekt und auch gar nicht weiter schlimm, weil sich das dritte Parameter aus der Methode ergibt.

Wenn du die Methode das erste Mal aufrufst übergibst Du das, was du gegeben hast (also n und array). Da Arrays immer bei dem index 0 beginnen, übergibst Du für den index einfach 0.

0

zahl%2 == 0

liefert true, wenn zahl gerade ist. Jetzt musst du nur noch zählen

Das weiß ich, aber das mit dem Zählen wird schwer vor allem da es rekursiv erfolgen soll

0

Was möchtest Du wissen?