mal wieder die böse Rekursion

Status
Nicht offen für weitere Antworten.

Sortus

Mitglied
Hallo ich komme nicht weiter...

alles was ich versuche ist entweder Falsch oder führt mich zu einem Stack - Overflow.
Und zwar habe ich folgendes Problem.

Wir sollen eine binäre Zahl (zB 110) durch Rekursion in eine Dezimale Zahl umwandeln (was in diesem Falle zB 7 wäre);
für die umwandlung bietet sich ja das Horner Schema an, was ich auch verstanden habe und beherrsche, es aber nicht in ein Javaprogramm umwandeln kann...

:meld:
Mein Programm hat bisher immer zuerst geprüft ob die umzuwandelne Zahl <=0 ist
Wenn ja geb "-1" aus ( ist vorgabe)
Wenn nein Zahl % 10 (die erste Zahl kann ja nur eine eins sein)
plus ja nun hier ist mein haken, bisher habe ich immer versucht
durch die Methode die basis zu potenzieren um an die richtige Zahl zu kommen.
Klappt aber irgendwie nicht

ich versuche es mal zu aufzuschreiben

Code:
public static long umwandelnDezimal(long zahl, int basis) {

return zahl <= 0 ? -1 : zahl % 10 + umwandelnDezimal(???);

}

Könnt ihr mir bitte weiterhelfen? Die Skripts helfen mir nicht wirklich weiter, hab da echt ne verständniss blokade... wenn mir jmd das mal ganz genau erklären könnte, fänd ich das super. Falls ihr euch darüber wundert in welcher Form ich das mache, bin im ersten Semester, haben noch nicht mehr zu verfügung (vlt. noch das math. aber das versteh ich auch net ^^).

vielen Dank im voraus
 

sliwalker

Top Contributor
Hoi,

Dein Beispiel prüft aber, ob die umzuwandelde zahl größer gleich 0 ist.
Nur mal so als info.
Dann gibt er -1 zurück.

Allgemein finde ich Deinen Aufbau auf den ersten Blick gefährlich ;)
Hast Du das so als Vorgabe bekommen?

greetz
SLi
 
S

SlaterB

Gast
> ob die umzuwandelne Zahl <=0 ist
+
> return zahl >= 0 ? -1

??

---------

dein restlicher Code scheint syntaktisch noch nicht korrekt zu sein,
von einem Sinn ganz zu schweigen,

beschreibe doch in Worten, wie Horner funktioniert,
wie es für 110 ablaufen würde
 

Sortus

Mitglied
ja das hab ich gerade auch gemerkt^^ hab ich schnell geändert. *rotwerd*

wir haben den Typ "long" neu hinzubekommen und sollen ihn auch einbauen... ja so in etwa liegt die vorgabe, bisher konnte ich auch immer alles,... nur die Rekursion macht mir einen Strich durch die rechnung

Also das Horner Schema Funktioniert folgendermaßen.
im prinzip wird immer die 1 addiert und mit der basis multipliziert und das überträgt sich dann auf die nächste Zahl...
bei 0 wird halt nichts addiert nur wieder mit der basis multipliziert, bis man die gesammte Zahlenreihe durch ist und das Ergebnis hat.
 
M

maki

Gast
Wir sollen eine binäre Zahl (zB 110) durch Rekursion in eine Dezimale Zahl umwandeln (was in diesem Falle zB 7 wäre);
110 wäre im Dualsystem 6, nicht 7.

Bist du sicher das du die Zahl als long übergeben bekommst?
"Normaler" und einfacher wäre ein String, Stellenwertigkeit.
 

Sortus

Mitglied
mhm nein.. ich poste mal was aus beispielen, so in etwa sollen wir das machen:

Code:
  public static boolean istPotenz(int zahl, int basis) {
    
    return (zahl == 1)
            || ((zahl % basis == 0) && istPotenz(zahl / basis, basis));
  }
oder
Code:
  public static int berechneReiheIter(int obergrenze,
          int schrittweite, int summe) {
    
    return (obergrenze == 0)
           ? summe
           : berechneReiheIter(obergrenze - schrittweite,
                   schrittweite, summe + obergrenze);

Wenn jmd Lust und Zeit hat, kann er es mir ja im TS erklären oder mir helfen...
 
S

SlaterB

Gast
die Beispiele entsprechen durchaus dem Code, den du schon hast,
den musst du nun fortführen,

zunächst die Frage, ob du mit String oder long als Eingabe arbeitest

und dann einfach den vorherigen Wert * 2 + aktuelle Ziffer, ob es nun 0 ist oder 1
 

Sortus

Mitglied
mit long... kannst du mir das evtl mal richtig erklären? Die Skripte sind da nicht sehr hilfreich...
 

Saxony

Top Contributor
Hiho,

hier mal eine Lösung für binär zu dezimal mit Rekursion:

Code:
public static int Bin2Dec(String aBin, int aCount) {
		
		if (aBin.length() == 0) return 0;
		
		return ((int)Math.pow(2, aCount) * (aBin.charAt(aBin.length() - 1) - '0')) + Bin2Dec(aBin.substring(0, aBin.length() - 1), ++aCount);
}

bye Saxony
 

Sortus

Mitglied
sehr nett von dir ^^ aber leider dürfen wir (bzw können wir) keine Strings einbauen, aber danke für deine hilfe...

im prinzip brauche ich ne rekursion, welche dies schafft (mit meinen methoden)

Code:
  public static int umwandelnDezimal(int zahl, int basis) {
    
 
    return zahl <=0 ? -1 : (zahl % 10) + (zahl / 10 % 10 * basis) + (zahl / 100 % 10 * (basis * basis)) + (zahl / 1000 % 10 * (basis * basis * basis));
    
  }

ich hab das mal einfach so gemacht um zu prüfen, ob ichs überhaupt verstanden hab. dies klappt, ist aber eher schlecht, da der Ausdruck nicht allgemeingültig ist... bin halt anfänger ^^
 

Saxony

Top Contributor
Hiho,

jo hab grad gelesen mit long:

Code:
public static long Bin2Dec(long aLong, int aCount) {
		
		if (aLong == 0) return 0;
		
		return ((long)Math.pow(2, aCount) * (aLong & 1)) + Bin2Dec(aLong / 10, ++aCount);
}

;)

bye Saxony
 

Marco13

Top Contributor
So als Tipp(?): Spontan würde ich sagen, dass die Methode DREI Parameter übergeben bekommen muss. (Wobei die auch privat sein kann, und durch eine public-Methode mit ZWEI Parametern aufgerufen wird)

Code:
public static int umwandelnDezimal(int zahl, int basis) 
{ 
    // if (blöde eingabe) { return irgendwas } else ...
    return umwandelnDezimal(zahl, basis, 1);
}

private static int umwandelnDezimal(int zahl, int basis, int current) 
{ 
     ....   ....   umwandelnDezimal(zahl / basis, basis, current * basis);
}
 

Sortus

Mitglied
danke für eure hilfe... bin nun schon weiter, bekomme nun keinen overflow mehr ^^

Code:
public static long umwandelnDezimal(long zahl, int basis) {
    
return zahl <= 0 ? -1 : (zahl % basis) + umwandelnDezimal ((zahl / 10) * basis,basis);
  }
          
public static void main(String[] args) {
        
System.out.println(umwandelnDezimal(11,2));
        }
    }

Also meine Frage, erreiche ich überhaupt mit dieser Methode das der immer wieder die Zahl nimmt sie mit % Basis nimmt und sie hochrechnet? Die Ergebnisse stimme nicht ganz merkwürdiger Weise immer etwa um 1falsch. Bis 30 dann stimmts garnet mehr ^^

Ich glaube ich hasse die Rekursion. Bitte keine hilfen mehr mit strings oder "if" sowas darf ich nicht benutzen.

Noch ne verständnissfrage, warum muss ich eigentlich bei ((zahl % basis) *basis,basis) das ...,basis hinterschreiben, ich weiß das ich es machen muss aber nicht warum, ansonsten spuckt er mir fehlermeldungen aus...
 

Saxony

Top Contributor
Sortus hat gesagt.:
Bitte keine hilfen mehr mit strings oder "if" sowas darf ich nicht benutzen.

Was spricht gegen meine oben genannte Version mit long?
Um dort noch das if wegzubekommen brauchste den trinären operator, welchen du ja eh schon verwendest.

Code:
public static long Bin2Dec(long aLong, int aCount) {

		return (aLong == 0)?0:((long) Math.pow(2, aCount) * (aLong & 1))
				+ Bin2Dec(aLong / 10, ++aCount);
}

bye Saxony
 

Saxony

Top Contributor
Sortus hat gesagt.:
danke für eure hilfe... bin nun schon weiter, bekomme nun keinen overflow mehr ^^

Code:
public static long umwandelnDezimal(long zahl, int basis) {
    
return zahl <= 0 ? -1 : (zahl % basis) + umwandelnDezimal ((zahl / 10) * basis,basis);
  }
          
public static void main(String[] args) {
        
System.out.println(umwandelnDezimal(11,2));
        }
    }

Dein Code macht alles andere, berechnet aber keine Dezimalform einer binären Zahl.

Punkt1: zahl <= 0 muss schon mal 0 und nicht -1 zurück geben werden.
Punkt2: mit (zahl % basis) bekommste schon mal die endzahl raus, weclhe aber noch mit basis^pos multipliziert werden muss.
Punkt3: wieso rufst du die Methode mit (zahl/10)*basis auf ?

zahl = 110
basis = 2

nächster aufruf wäre dann umwandelDezimal(22, 2), 22 ist aber schon gar keine binäre Darstellung mehr.
Punkt4: wo wird sich zudem die aktuelle Wertigkeit(Position) einer Stelle gemerkt um basis^pos rechnen zu können?

bye Saxony
 

Leroy42

Top Contributor
Code:
public static long umwandelnDezimal(long zahl, int basis) { 
    return zahl < 0 ? -1 : umwandelnDezimalHelp(zahl, basis); 
}
public static long umwandelnDezimalHelp(long zahl, int basis) { 
    return zahl == 0 ? 0 : (zahl % basis) + umwandelnDezimalHelp((zahl / 10), basis) * basis; 
}

Feddsch! :cool:
 

Leroy42

Top Contributor
Ohh Shit! Hab 'n Fehler übersehen(*) :shock:

Code:
public static long umwandelnDezimal(long zahl, int basis) { 
    return zahl < 0 ? -1 : umwandelnDezimalHelp(zahl, basis); 
} 
public static long umwandelnDezimalHelp(long zahl, int basis) { 
    return zahl == 0 ? 0 : (zahl%10) + umwandelnDezimalHelp(zahl/10, basis) * basis; 
}

So sollte es klappen:

Code:
umwandelnDezimal(110 /* eigentlich einhundertundzehn */, 2) liefert 6

(*) Sollte in Zukunft besser erst rausgehen um mir eine reinzuziehen; als umgekehrt. :cool:
 

Saxony

Top Contributor
Jo, net schlecht.
Mit dem Rückgabe * basis kann man sich das Math.pow() selber basteln.

bye Saxony
 

Leroy42

Top Contributor
Saxony hat gesagt.:
Mit dem Rückgabe * basis kann man sich das Math.pow() selber basteln.

Das ist ja auch der Sinn weshalb eine rekursive Lösung gefordert wurde.

Obwohl ich es für äußerst befremdend erachte, daß die binäre Darstellung
als Zahl (110 = hundertzehn) angegeben werden soll anstatt eines Strings
oder eines char-Arrays.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
richis-fragen JTable setModel(myModel) ok -> wie wieder unset machen? Java Basics - Anfänger-Themen 4
DrahtEck Schleife soll wieder da anfangen wo ich es möchte ! Java Basics - Anfänger-Themen 17
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
Temsky34 Wie bekomme ich dieses Java-Warning wieder weg? Java Basics - Anfänger-Themen 2
T j.u.Scanner(Sys.in).nextLine() wieder schließen? Java Basics - Anfänger-Themen 5
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
O Text mit Regex trennen und wieder zusammenbauen Java Basics - Anfänger-Themen 5
Naxon89 Input/Output Ein PDF in einem BLOB umwandeln um ihn dann als PDF wieder anzuzeigen Java Basics - Anfänger-Themen 3
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
MichelNeedhelp Brauche zu diesem Labyrinth ein Skript? Der Hamster soll im Urzeigersinn das ganze Labyrinth abgehen und wieder an seinem Ursprungsplatz sein. Java Basics - Anfänger-Themen 40
D Codeblöcke, die immer wieder im Programmverlauf benötigt werden Java Basics - Anfänger-Themen 5
TimoN11 Array -> Schleife wieder von vorne durchlaufen lassen Java Basics - Anfänger-Themen 1
JD_1998 Arrays einlesen, zwischenspeichern und wieder ausgeben Java Basics - Anfänger-Themen 8
M Regex Probleme (mal wieder) Java Basics - Anfänger-Themen 3
J Selektiertes Element von jComboBox zwischenspeichern und wieder einsetzen Java Basics - Anfänger-Themen 0
S Nutzereingabe splitten und in string array wieder ausgeben. Java Basics - Anfänger-Themen 1
I wieder mit einer Umwandelung habe ich Problem (diesmal von char Array zu char) Java Basics - Anfänger-Themen 1
N Wie kann ich einen String wieder zusammensetzen und ausgeben lassen? Java Basics - Anfänger-Themen 9
C Array-Eintrag wieder auf Null setzen Java Basics - Anfänger-Themen 3
W Verschachtelte Objekte wieder auspacken Java Basics - Anfänger-Themen 3
M Array immer wieder um ein Element erweitern Java Basics - Anfänger-Themen 6
CptK Methoden Event bei gedrückter Maustaste immer wieder ausführen Java Basics - Anfänger-Themen 1
CptK Klassen Event bei gedrückter Maus immer wieder mit Pause ausführen Java Basics - Anfänger-Themen 2
J Geld speichern und wieder auslesen Java Basics - Anfänger-Themen 10
M JTextField blitzt immer wieder nur auf Java Basics - Anfänger-Themen 12
CptK Datentypen Verdrehte Wörter wieder herstellen Java Basics - Anfänger-Themen 21
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
I Methoden Schleife immer wieder durchlaufen lassen Java Basics - Anfänger-Themen 15
F Immer wieder gleiche Zufallszahl? Java Basics - Anfänger-Themen 4
M Schleifenergebnis in selbiger wieder verwenden Java Basics - Anfänger-Themen 7
L Methoden Rekursion gibt alten Wert wieder Java Basics - Anfänger-Themen 37
L jar, class, java und wieder zurück Java Basics - Anfänger-Themen 8
M aus Fenster anderes Fenster öffnen und wieder umgekehrt Java Basics - Anfänger-Themen 5
J Fenster wieder unsichtbar machen Java Basics - Anfänger-Themen 2
J Auslesen/speichern und wieder einlesen Java Basics - Anfänger-Themen 7
S Sound stoppen und nach Pause wieder abspielen Java Basics - Anfänger-Themen 6
T while schleife starten , beeneden und wieder Starten Java Basics - Anfänger-Themen 8
I Zähler, der erst wieder zählt nachdem Pixel wieder andere Farbe hat Java Basics - Anfänger-Themen 2
B javax.ejb.Timer wieder starten? Java Basics - Anfänger-Themen 0
N Methode auslagern mal wieder Java Basics - Anfänger-Themen 8
F Inhalt einer Variable auswerten, die sich immer wieder ändert Java Basics - Anfänger-Themen 1
B ja ja schon wieder einer mit einer public static void main(string[] args) Frage... Java Basics - Anfänger-Themen 8
Bluedaishi for schleife um Dateien wieder zusammen zu fügen Java Basics - Anfänger-Themen 11
I SHA512 verschlüsseln und dann wieder auslesen? Java Basics - Anfänger-Themen 35
F Timer abbrechen und wieder starten Java Basics - Anfänger-Themen 5
J KeyListener - mal wieder... Java Basics - Anfänger-Themen 2
B Listener beim Laden (deserialize) wieder hinzufügen bzw. mitspeichern? Java Basics - Anfänger-Themen 3
GadgetSofa .txt Datei erstellen und gleich wieder Löschen? Java Basics - Anfänger-Themen 12
D Bild für ein paar Sekunden einblenden und wieder ausblenden Java Basics - Anfänger-Themen 1
M Tabelle aktualisieren (mal wieder) Java Basics - Anfänger-Themen 10
M Erste Schritte Tabelle aktualisieren (mal wieder) Java Basics - Anfänger-Themen 7
M Zahlen als Bytes in eine Datei speichern, daraus wieder auslesen Java Basics - Anfänger-Themen 2
D Schon wieder double -.- Java Basics - Anfänger-Themen 4
R Switch: Nach durchlaufen des Case wieder zum Menü Java Basics - Anfänger-Themen 3
K For Each Schleife wieder von Beginn an iterieren Java Basics - Anfänger-Themen 12
L Und schon wieder :=( Java Basics - Anfänger-Themen 3
T Arbeitsspeicher wieder freigeben Java Basics - Anfänger-Themen 21
Ernesto95 BufferedImage Teilbereich wieder transparent setzen Java Basics - Anfänger-Themen 16
J Schon wieder Rekursionsproblem Java Basics - Anfänger-Themen 3
S Erste Schritte Hochgescrolltes Menu nach MouseOut wieder "runter holen" Java Basics - Anfänger-Themen 3
H Datei in kleine Stücke teilen und wieder erkennen Java Basics - Anfänger-Themen 10
B Variable wird einfach so wieder auf "null" gesetzt Java Basics - Anfänger-Themen 12
B Cookies auslesen und wieder schreiben Java Basics - Anfänger-Themen 2
T wieder mal Serialization :-) Java Basics - Anfänger-Themen 10
J Mal wieder ein kleines Toleranzproblem Java Basics - Anfänger-Themen 20
T text von textfeld auslesen und wieder reinschreiben Java Basics - Anfänger-Themen 10
T Benutzereingabe in form von string wieder ausgeben in JOptionPane Java Basics - Anfänger-Themen 14
F Input/Output ArrayList presistent speichern und wieder auslesen Java Basics - Anfänger-Themen 4
D Ausgegebene Worte wieder löschen. Java Basics - Anfänger-Themen 6
B Heap-Speicher wieder freigeben Java Basics - Anfänger-Themen 10
P Mal wieder JTable Java Basics - Anfänger-Themen 7
V Schon wieder ein kleines problem...dieses mal mit do-while loop Java Basics - Anfänger-Themen 9
M Mal wieder Probleme mit Date Java Basics - Anfänger-Themen 9
M Threads Thread ist nur kurz interrupted, dann wieder nichtmehr Java Basics - Anfänger-Themen 6
K Mal wieder ein Problem mit If / Else Java Basics - Anfänger-Themen 10
A Wie kann man etwas von Typ Image wieder löschen? Java Basics - Anfänger-Themen 7
J Threads Threads anhalten und wieder fortführen Java Basics - Anfänger-Themen 9
P Dropdownbox nach hinzufügen wieder öffnen Java Basics - Anfänger-Themen 7
A Daten speichern und wieder in ein Array laden Java Basics - Anfänger-Themen 4
B Datentypen Inhalt zum Iterator wieder aufrufen? Java Basics - Anfänger-Themen 10
Os-Programming Checkbox immer wieder überprüfen Java Basics - Anfänger-Themen 13
S Datei einlesen und Ergebnis wieder in Datei schreiben Java Basics - Anfänger-Themen 5
J Datei einlesen teile aus lines ändern und wieder rausschreiben. Java Basics - Anfänger-Themen 4
M String-Array-Element wieder null zuweisen Java Basics - Anfänger-Themen 16
K Wie kann ich aus jar Dateien wieder normale Klassen generieren? Java Basics - Anfänger-Themen 7
F Mal wieder: Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 9
F Collections Datenbankdaten in einer Map speichern, bearbeiten, sortieren und wieder in Datenbank schreiben Java Basics - Anfänger-Themen 20
B Datentypen Werte in einen Array einlesen und danach die beiden höchsten Werte wieder ausgeben Java Basics - Anfänger-Themen 3
L Datentypen byte[] in String und wieder zurück Java Basics - Anfänger-Themen 3
B Datei in mehrere Ordner splitten und wieder zusammenfuegen... Java Basics - Anfänger-Themen 3
R ARRAY/List die sich immer wieder von vorne neu auffüllt ? Java Basics - Anfänger-Themen 21
F OOP Wieder mal Zugriffsprobleme... (Lösung am Ende) Java Basics - Anfänger-Themen 11
M Dynamisches Casten mal wieder Java Basics - Anfänger-Themen 4
P Zwei Charakter als Paramter übergeben und wieder ausgeben Java Basics - Anfänger-Themen 10
D Array speichern und wieder aufrufen Java Basics - Anfänger-Themen 6
Dit_ Thread stoppen und wieder starten Java Basics - Anfänger-Themen 2
M AudioStream - wiederholen, pausieren und wieder starten Java Basics - Anfänger-Themen 2
U Threads - Beenden/ Wieder starten Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben