Frage zu Java Rekursion (Dezimalzahl in das übergebene Zahlensystem umwandeln)?

4 Antworten

Klasse, vielen Dank. War eigentlich mega simpel... hätte nicht so schnell aufgeben sollen ;-) Für alle die es interessiert, habe es so gelöst:

public static long gibDarstellung(long zahl, int basis){ return (zahl <= 0) ? zahl % basis : zahl % basis + gibDarstellung(zahl / basis, basis) * 10; }

Eine Dezimalzahl ist nichts anderes als ein Polynom Summe(a_i 10^i)

Eine Binärzahl entsprechend Summe(a_i 2^i)

Wie kommt man an die Binärdarstellung? Man sucht die erste 2er-Potenz, die kleiner oder gleich der Dezimalzahl ist (hier 8) und legt los:

15:8 = 1 Rest 7 → nächster Durchlauf mit 7
7:4 = 1 Rest 3 → ...

Mit jedem Durchlauf wird der Exponent um 1 geringer, bzw. die Potenz durch die Basis geteilt. Die Quotienten und Reste müssen immer weitergetragen werden.

Aber nochmal zum Hornerschema. Der Nutzen liegt in der Vermeidung des Potenzierens:

15 = (1*8+7) = (1*8 + 1*4 + 1*2 + 1*1) = (((1*2)+1)*2+1)*2+1

Ein Weg vom Binärsystem ins Dezimalsystem würde mir leichter fallen.

Eine rekursive Funktion könnte vielleicht grob skizziert so aussehen (Pseudocode):

function string DezToBin(var iDez, var sKette, var iExp=10)
{
  if(iExp>0)
    return str(iDez \ iExp) + DezToBin(iDez % iExp, iExp-1); // \ = ganzzahlige Dividion
  else
   return "";
}

Die Funktion muss mit einem möglichst hohen Exponenten als Startwert (Defaultwert) gestartet werden.

Woher ich das weiß:Berufserfahrung – Programmierer
Suboptimierer  09.09.2015, 17:58

Bzw.

return str(iDez \ (2^iExp)) + DezToBin(iDez % (2^iExp), iExp-1);

Sorry, habe nichts zum Testen zur Hand.

Die Funktion muss mit einem möglichst hohen Exponenten als Startwert (Defaultwert) gestartet werden.

Die 2 kann natürlich zu einer beliebigen Basis verallgemeinert werden, die jedoch übergeben werden muss. Aber einem Stellenwertsystem größer 10 muss außedem in der Zeichenkette 10 durch A usw. ersetzt werden, weil man sonst 1  0 nicht von A unterscheiden könnte.

Die Funktion arbeitet zwar rekursiv, aber ohne das Hornerschema. :(

0

http://www.inf.fh-flensburg.de/lang/informatik/zahlendarstellung.htm Ganz nach unten scrollen. Dort findest du über den Aufgaben einen Algorithmus. Den erstmal in einer Programmiersprache implementieren und dann in eine Rekursion umwandeln. Wichtig: Rekursionen werden wie reguläre Schleifen durch eine Abbruchbedingung beendet. Gruß :)

Reyha24  09.09.2015, 17:37

Nachvollziehen solltest du den Algorithmus natürlich auch :)

0

So ist es villt übersichtlicher:


public static long gibDarstellung(long zahl, int basis) { 

return (zahl <= 0) 

      ? zahl % basis

      : zahl % basis + gibDarstellung(zahl / basis, basis) * 10;

 }