![]() |
Rekursiv function
Delphi-Quellcode:
integer und extendet sind inkompatibel. d.h. ich kann nich kompilieren...warum??
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; 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] |
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 :-) |
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; |
Re: Rekursiv function
Wieso nicht einfach den Ergebnistyp von ZweiHoch von Real auf Integer stellen? Denn diese Funktion kann sowieso nur Ganzzahlen zurückgeben.
|
Re: Rekursiv function
ja stimmt...war blöde sry bin nich draufgekommen...O:-) trotzdem danke für die mühe
|
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; |
Re: Rekursiv function
2^1 ergibt bei mir immer noch 2, 2^0 = 1.
|
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:
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)
Result := ZweiHoch(Length(s)) + BinDual(Copy(s, 2, Length(s) - 1))
Wenn der erste Fehler korrigiert wird, muss da dann length(s)-1 stehen ;) |
Re: Rekursiv function
Ich hatte mir auch nur die erste Funktion angesehen, daher mein Einwand.
|
Re: Rekursiv function
Hallo Speedy23,
schon mal daran gedacht, die Logik und die Ausgabe zu vereinen?
Delphi-Quellcode:
Der Aufruf sähe in etwa wie folgt aus:
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;
Delphi-Quellcode:
Schöne Grüße
WriteBin(12);
Oreaden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 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