Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Rekursiv function (https://www.delphipraxis.net/123939-rekursiv-function.html)

speedy23 11. Nov 2008 18:25


Rekursiv function
 
Delphi-Quellcode:
implementation
function ZweiHoch(n:integer):real;
var i:integer;
    p:real;

begin
   if n=0 then Zweihoch:=1
   else Zweihoch:=2*Zweihoch(n-1);

end;
function bindual(s:string):integer;
begin
if length(s)=0 then bindual:=0 else
if s[1]='1' then
bindual:=zweihoch(length(s))+bindual(copy(s,2,length(s)-1)) else
bindual:=bindual(copy(s,2,length(s)-1));
end;
integer und extendet sind inkompatibel. d.h. ich kann nich kompilieren...warum??
PS das soll ne binärzahl in ne dezimalzahl rekursiv umwandeln;-)

[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen - Mfg, SirThornberry[/edit]

SirThornberry 11. Nov 2008 18:32

Re: Rekursiv function
 
wofür hast du die Variable i declariert in der Funktion ZweiHoch?
Im übrigen hast du weniger Aufwand bei der Pflege wenn du "result :=" anstelle von "Funktionsname :=" verwendest. Wenn du die Funktion irgendwann mal umbenennst musst du, so wie du es bisher machst, diese ganzen Stellen auch mit ändern. Wenn du jedoch "result" verwendest musst du dort nichts mehr machen.
In welcher Zeile bekommst du den Fehler? Und kannst du das ganze eventuell richtig einrücken, dann findet man auch leichter den Fehler weil man sofort sieht was wohin gehört :-)

mkinzler 11. Nov 2008 18:39

Re: Rekursiv function
 
Besser
Delphi-Quellcode:
function ZweiHoch(n:integer):Extended;
var i:integer;
    p:real;

begin
   if n=0 then result :=1
          else result := 2*Zweihoch(n-1);

function bindual(s:string):integer;
begin
  if length(s)=0 then result := 0 
                 else if s[1]='1' then result := Trunc(zweihoch(length(s)))+bindual(copy(s,2,length(s)-1))
                                  else result := bindual(copy(s,2,length(s)-1));
end;

Fussball-Robby 11. Nov 2008 18:40

Re: Rekursiv function
 
Wieso nicht einfach den Ergebnistyp von ZweiHoch von Real auf Integer stellen? Denn diese Funktion kann sowieso nur Ganzzahlen zurückgeben.

speedy23 11. Nov 2008 18:41

Re: Rekursiv function
 
ja stimmt...war blöde sry bin nich draufgekommen...O:-) trotzdem danke für die mühe

Fussball-Robby 11. Nov 2008 18:45

Re: Rekursiv function
 
Und noch was: In ZweiHoch musst du n nicht gleich Null sondern gleich 1 prüfen, hier nochmal beide Funktionen (auch richtig eingerückt, das sollte man sich unbedingt angewöhnen :zwinker: )
Delphi-Quellcode:
function ZweiHoch(n: integer): Integer;
begin
   if n = 1 then
     Result := 1
   else
     Result := 2 * Zweihoch(n - 1);
end;

function BinDual(s: String): Integer;
begin
  if Length(s) = 0 then
    Result := 0
  else
    if s[1]= '1' then
      Result := ZweiHoch(Length(s)) + BinDual(Copy(s, 2, Length(s) - 1))
    else
      Result := BinDual(Copy(s, 2, Length(s) - 1));
end;

DeddyH 11. Nov 2008 18:55

Re: Rekursiv function
 
2^1 ergibt bei mir immer noch 2, 2^0 = 1.

jfheins 11. Nov 2008 18:59

Re: Rekursiv function
 
Nein Detlef dann wirds falsch ;)

Da 2 Fehler eingebaut sind, die sich gegenseitig kompensieren, müsstest du schon beide beheben ;)

Der erste Fehler ist natürlich dass 2^1 = 2 und 2^0 = 1 ;)

Der zweite liegt hier:
Delphi-Quellcode:
      Result := ZweiHoch(Length(s)) + BinDual(Copy(s, 2, Length(s) - 1))
Denn length() liefert bei eine string der länge 1 auch 1 Zuürck und nicht 0 (obwohl die Wertigkeit dieser Position 2^0 ist)

Wenn der erste Fehler korrigiert wird, muss da dann length(s)-1 stehen ;)

DeddyH 11. Nov 2008 19:21

Re: Rekursiv function
 
Ich hatte mir auch nur die erste Funktion angesehen, daher mein Einwand.

Oreaden 11. Nov 2008 19:30

Re: Rekursiv function
 
Hallo Speedy23,

schon mal daran gedacht, die Logik und die Ausgabe zu vereinen?
Delphi-Quellcode:
procedure WriteBin(aNum: word; Anz: integer = 4*4-1);
begin
  if (aNum and $8000) <> 0 then
    write('1')
  else
    write('0');
  if Anz > 0 then
    WriteBin(aNum shl 1, Anz -1);
end;
Der Aufruf sähe in etwa wie folgt aus:
Delphi-Quellcode:
WriteBin(12);
Schöne Grüße
Oreaden

speedy23 11. Nov 2008 22:32

Re: Rekursiv function
 
daran habe ich noch nicht gedacht weil ichs nochnet kann...hab delphi inna schule
wisst ihr ;)

Die Muhkuh 11. Nov 2008 22:34

Re: Rekursiv function
 
Man sollte die Logik immer von der Eingabe und der Ausgabe trennen!

mkinzler 11. Nov 2008 22:39

Re: Rekursiv function
 
Zitat:

Zitat von Die Muhkuh
Man sollte die Logik immer von der Eingabe und der Ausgabe trennen!

Den Adam steht auf EVA :zwinker:

Medium 12. Nov 2008 05:57

Re: Rekursiv function
 
Zitat:

Zitat von Oreaden
schon mal daran gedacht, die Logik und die Ausgabe zu vereinen?

Huaaaaa *schüttel*. Dass das nicht das gelbe vom Ei ist weiss man ja nun schon ein paar Jahre. Genau sowas würde ich einem Programmieranfänger versuchen minütlich auszureden, statt es vorzuschlagen. Hat finde ich ja schon fast den Level von Goto Vorschlagen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz