Lineare Rekurison gibAnzahl

NoP-ay

Neues Mitglied
Hallo ihr lieben. Die Aufgabenstellung lautet.

-Methode int gibAnzahl(long, int), die angibt, wie häufig eine Ziffer (2. Parameter)
in der Dezimaldarstellung einer Zahl (1. Parameter) vorkomm

Dabei darf ich keine Schleifen nutzen, lediglich einen bedingten Ausdruck.
____________________________________________________________________________
Meine Lösung sieht aktuell wie folgt aus.

Java:
public static int gibAnzahl(long zahl1,
      int zahl2) {

    return gibAnzahl(zahl1, zahl2, 0);
  }

  public static int gibAnzahl(long zahl1,long zahl2,int startwert) {

    return zahl1 < 10
        ? zahl1 == zahl2
            ? startwert + 1
            : startwert
        : zahl1 % 10 == zahl2
            ? gibAnzahl(zahl1 / 10, zahl2, startwert + 1)
            : gibAnzahl(zahl1 / 10, zahl2, startwert);
}
_____________________________________________________________________________
Ich habe das ganze jetzt mithilfe der Überladung lösen können.
Mich würde allerdings interessieren wie ich das ganze ohne die Überladung und nur mit
2 Parametern und dem bedingten Ausdruck bewerkstelligen kann.
Ich wüsste zum ende hin nicht, wie ich die anzahl erhöhe und zeitgleich die Methode neu aufrufe wenn der Asudruck ja ist (zahl1 % 10 == zahl2)
______________________________________________

Java:
public static int gibAnzahl(long zahl1,
      int zahl2) {

    int anzahl = 0;
 
 
    return zahl1 < 10
        ? zahl1 == zahl2
             ? anzahl + 1
             : anzahl
        : zahl1 % 10 == zahl2
              ? gibAnzahl(zahl1,zahl2)


lieben Dank im vorfeld.
lg
NoP-ay
 

LimDul

Top Contributor
Also grundsätzlich finde ich deine Lösung vollkommen in Ordnung.

Du kannst aber den Parameter startwert einfach wegwerfen. Ein Anzahl brauchst du auch nicht.

Einfach die Rückgabe weiterverwerten.

Java:
    return zahl1 < 10
        ? zahl1 == zahl2
             ? 1
             : 0
        : zahl1 % 10 == zahl2
              ? gibAnzahl(zahl1,zahl2) + 1
              : gibAnzahl(zahl1,zahl2);
Was du mit deinem Startwert machst, du zählst beim Abstieg in die Rekursion mit, wie oft du einen "Treffer" hattest.
Das heißt, bei dir ist der Rückgabewert eines jeden Rekursionsaufrufes der finale Wert, weil du den Zähler bis zur einstelligen Ziffer mitschleppt

Was meine Lösung macht, sie zählt beim Ausstieg aus der Rekursion hoch.
Das heißt, hier ist nur die Rückgabe des obersten Aufrufes korrekt, es wird kein Status gehalten. Der Rückgabewert des Aufrufs der einstelligen Ziffer ist 0 oder 1. Und dann wird da ggf. immer 1 addiert bei jeder weiteren Rückgabe.
 

KonradN

Super-Moderator
Mitarbeiter
Also bei dem Code frage ich michm, ob man dies nicht noch unleserlicher machen kann. Zwei ternäre Operatoren in einem ternären Operator?

Zumal sich da schnell ein Fehler einschleicht - so wird hier der rekursive Aufruf mit den original Parametern vorgenommen, was bei zahl 1 >= 10 zu einem Stackoverflow führen dürfte! (Code von euch beiden so ich das richtig gesehen habe - nur die erste Lösung des TE hat dieses Problem wohl nicht!) Falls ich mich da vertan habe, dann sorry - aber auf den ersten Blick sieht es zumindest dubios aus!

Gerade bei so Dingen kann man sich immer überlegen, was denn das Vorgehen ist und es 1:1 umsetzen.

Das typische Vorgehen ist immer:
  • Prüfung Abbruchbedingung
  • rekursiver Aufruf
  • Bestimmung des Ergebnisses (Kann in dem 2ten Punkt enthalten sein)

Das kann also einfach etwas sein wie:

Java:
if (zahl1 == 0) return 0; 

int rekursivesResult = gibAnzahl(zahl1/10, zahl2);

if (zahl1 % 10 == zahl2) {
    return result + 1;
} else {
    return result;
}

Ob man da dann den rekursiven Aufruf separat nimmt oder ob man daraus dann sowas macht:

Java:
if (zahl1 == 0) return 0;

if (zahl1 % 10 == zahl2) {
    return gibAnzahl(zahl1/10, zahl2) + 1;
} else {
    return gibAnzahl(zahl1/10, zahl2);
}

ist erst einmal egal - aber das ist relativ sauber zu lesen. Die Rekursion ist gut zu erkennen. Ebenso ist deutlich, dass es zu einem Abbruch kommen wird.

Tipp1:
Dann ganz am Rande noch ein Hinweis: Wenn man feststellt, dass man bei der Abbruchbedingung noch eine Aktion hat, dann ist das oft einfach ein Zeichen, dass man einfach einen Schritt zu früh abgebrochen ist. Also bei dem Code von euch beiden ist es die Prüfung, ob die Ziffer denn gleich der zahl2 ist. Daher die Prüfung in beiden Bereichen des tenären Operators.

Tipp2:
Es gibt unleserliche Operatoren - das sind speziell der Pre-/Post- Increment-/Decrement- Operator als auch der tenäre Operator. Diese sollte man immer nur in ganz übersichtlichen Dingen einsetzen, bei denen die Funktionalität wirklich von Anfang an klar ist. Die increment/decremet Operatoren sollten so nur auf einer Zeile für sich stehen und nicht in einem Statement. Und der tenäre Operator wird nicht verschachtelt!
Das führt nur zu Fehlern und die sind absolut vermeidbar.
 

mihe7

Top Contributor
Kleiner Typo, das muss natürlich result heißen (das ist dem Umstand geschuldet, dass @KonradN den Code hier direkt eintippt, in einer IDE wäre das natürlich sofort aufgefallen).

Persönlich würde es mir so besser gefallen:

Java:
if (zahl1 == 0) return 0; 

int result = gibAnzahl(zahl1/10, zahl2);

if (zahl1 % 10 == zahl2) {
    result++;
}

return result;
 

KonradN

Super-Moderator
Mitarbeiter
Ja, im Forum Code schreiben ist immer fehleranfällig. Danke für die Ergänzung @mihe7! Die Variante mit dem Erhöhen wenn die Ziffer gleich der Zahl2 ist, gefällt mir auch noch besser als meine Varianten :)
 

NoP-ay

Neues Mitglied
Vielen lieben dank für die schnellen Antworten.
Habs nun verstanden, mich irritierten die 2 Paramter und ich hab da in die völlig falsche Richtung gedacht.
Bezüglich der 2 Parameter stellen sich mir tatsächlich noch weitere Fragen , diesmal allerdings in Verbindung mit einem
booleschen Asudruck.

KonradN, diese Aufgaben dienen aktuell zur Übung, so dass ich tatsächlich lediglich einen bedingten Ausdruck nutzen darf.
Die If Anweisungen haben wir bisher leider noch nicht erarbeitet.Denke die werden nicht lange auf sich warten lassen.

Da meine Frage bezüglich der Aufgabe beantwortet ist würde ich das Thema schließen, sofern er möglich ist?
Verzeiht,ich bin mit Foren bisher nicht allzu vertraut 😅
 

KonradN

Super-Moderator
Mitarbeiter
KonradN, diese Aufgaben dienen aktuell zur Übung, so dass ich tatsächlich lediglich einen bedingten Ausdruck nutzen darf.
Die If Anweisungen haben wir bisher leider noch nicht erarbeitet.Denke die werden nicht lange auf sich warten lassen.
Das ist ok und das war von mir nur ein allgemeiner Hinweis. Es ist durchaus wahr, dass man sowas lernen muss, aber halte den Hinweis dennoch im Kopf! Man sieht sowas leider zu oft und da ist dann so ein Hinweis aus meiner Sicht wichtig (Zumal lesbarer Code auch gerade Anfängern das Leben erleichtert).

Und dann beachte, dass Du natürlich nicht zahl1 sondern zahl1/10 als Parameter übergeben musst.

Da meine Frage bezüglich der Aufgabe beantwortet ist würde ich das Thema schließen, sofern er möglich ist?
Ein Schließen gibt es für den normalen User nicht. Aber danke für diese Rückmeldung - es ist immer gut zu lesen, dass ein Thema für den Ersteller erst einmal erledigt ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
amelie123456 Lineare Suche / Binäre Suche Java Basics - Anfänger-Themen 2
S Lineare listen verkettung Java Basics - Anfänger-Themen 7
V_Fynn03 Beliebiges Element in einer Liste löschen (Java)(Lineare Datenstrukturen) Java Basics - Anfänger-Themen 9
V_Fynn03 Lineare Datenstrukturen Element löschen? Java Basics - Anfänger-Themen 2
S Java Lineare-Suche Zeitmessung Java Basics - Anfänger-Themen 5
S Java Lineare Suche Java Basics - Anfänger-Themen 1
A Was könnten typische Prüfungsaufgaben zum Thema lineare, verkettete Listen sein? Java Basics - Anfänger-Themen 5
B lineare und schlichte Rekursion Java Basics - Anfänger-Themen 1
A Lineare Rekursion Java Basics - Anfänger-Themen 6
R Klassen Die lineare Datenstruktur Queue Java Basics - Anfänger-Themen 3
N Array, lineare Suche, binäre Suche, Programm bleibt unerwartet stehen... Java Basics - Anfänger-Themen 6
L Einfache Lineare Suche Java Basics - Anfänger-Themen 7
S Lineare Gleichung lösen Java Basics - Anfänger-Themen 1
L Lineare Listen Java Basics - Anfänger-Themen 2
S Datentypen nicht lineare STATISCHE Datenstruktur? Java Basics - Anfänger-Themen 10
B lineare Gleichung programmieren Java Basics - Anfänger-Themen 2
P Lineare Suche im Array Java Basics - Anfänger-Themen 5
C Lineare Rekursion -> iterative Schleife Java Basics - Anfänger-Themen 3
B Lineare Suche Java Basics - Anfänger-Themen 5
B endrekursion und lineare rekursion Java Basics - Anfänger-Themen 4
U Lineare Suche in einem Array Java Basics - Anfänger-Themen 3
T Lineare Listen: sortiertes Einfügen Java Basics - Anfänger-Themen 6
I Lineare Gleichungssysteme lösen -> Problem Java Basics - Anfänger-Themen 3
M lineare Suche Java Basics - Anfänger-Themen 12
G verkettete lineare Liste Java Basics - Anfänger-Themen 2
D Lineare Kongruenz Java Basics - Anfänger-Themen 4
B Warum hat dieser einfache Algorithmus lineare Laufzeit? Java Basics - Anfänger-Themen 3
G Array - lineare Liste Java Basics - Anfänger-Themen 2
Chucky Lineare Listen Programm Verständnisproblem Java Basics - Anfänger-Themen 38

Ähnliche Java Themen

Neue Themen


Oben