Delphi-PRAXiS
Seite 1 von 2  1 2      

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 17: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 17: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 17: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 17: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 17: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 17: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 17:55

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

jfheins 11. Nov 2008 17: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 18:21

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

Oreaden 11. Nov 2008 18: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


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr.
Seite 1 von 2  1 2      

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