Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Größten Teiler von zwei Zahlen (rekursiv)


Baphomet - So 24.09.06 14:18
Titel: Größten Teiler von zwei Zahlen (rekursiv)
hey leute
also wir haben als schulübung auf den größten Teiler von zwei Zahlen zu ermitteln und zwar rekursiven

bei meinem Programm tritt jetzt aber ein komischer Fehler auf den ich mir nicht erklären kann
das programm gibt mir immer die gleichen Zahlenfolge aus. Ich kann mir nicht erklären wie diese Zahlenfolge entsteht
das Programm funktioniert nur wenn a=b ist

hier mein programm:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
function RekursiverAlgoritmus(a, b : Integer) : Integer;
begin
  if a=b
   then RekursiverAlgoritmus:= a
  else if a > b
   then
    begin
     a:= a-b;
     RekursiverAlgoritmus(a, b);
    end
  else if a < b
   then
    begin
     b:= b-a;
     RekursiverAlgoritmus(a, b);
    end;
end;



procedure TMainForm.Berechnen1Click(Sender: TObject);
var Zahl1, Zahl2 : Integer;
begin
  Zahl1:= StrToInt(EZahl1.Text);
  Zahl2:= StrToInt(EZahl2.Text);
  EErgebnis.Text:= IntToStr(RekursiverAlgoritmus(Zahl1, Zahl2));
end;


hoffe ihr könnt mir helfen

greetz Baph


cuejo - So 24.09.06 14:52
Titel: Re: Größten Teiler von zwei Zahlen (rekursiv)
user profile iconBaphomet hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function RekursiverAlgoritmus(a, b : Integer) : Integer;
begin
  if a=b
   then RekursiverAlgoritmus:= a {*Das wird nicht funktionieren,Du meinst wohl result:=a; !?!*}
  else if a > b
   then
    begin
     a:= a-b;
     RekursiverAlgoritmus(a, b);
    end
  else if a < b
   then
    begin
     b:= b-a;
     RekursiverAlgoritmus(a, b);
    end;
end;



Baphomet - So 24.09.06 14:57

wieso sollte das denn nicht funktionieren

in einer Funktion sind doch Funktionsname und result das gleiche, oder nicht?
also sind beide der Rückgabewert...

sichheithalber hat ichs ausprobiert und es hat nicht funktioniert

kam das selbe ergebnis raus

wenns daran liegen würde, dürfte es ja dann eigentlich auch nicht klappen, wenn a=b ist

aber dann klappts ja komischer weise...

greetz Baph


cuejo - So 24.09.06 19:49

user profile iconBaphomet hat folgendes geschrieben:
in einer Funktion sind doch Funktionsname und result das gleiche, oder nicht?

Achso, wusste ich nicht, tut mir Leid. :oops:


cuejo - So 24.09.06 19:55
Titel: Re: Größten Teiler von zwei Zahlen (rekursiv)
Versuchs mal so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function RekursiverAlgoritmus(a, b : Integer) : Integer;
begin
  if a=b then RekursiverAlgoritmus:= a else 
  begin 
    if a > b then 
    begin
      a:= a-b;
      RekursiverAlgoritmus(a, b);
    end;
    if a < b then 
    begin
      b:= b-a;
      RekursiverAlgoritmus(a, b);
    end;
  end;
end;


soisseteben - So 24.09.06 20:17

Hi,
so klappts:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.Button1Click(Sender: TObject);
var a, b: Integer;
begin
  a := StrToInt(Edit1.Text);
  b := StrToInt(Edit2.Text);

  if b >= a then
    RekursiverAlgoritmus(a, b, a)
  else
    RekursiverAlgoritmus(a, b, b);
end;

procedure TForm1.RekursiverAlgoritmus(a, b, Erg: Integer);
begin
  if (a mod Erg = 0and (b mod Erg = 0then
    Label1.Caption := IntToStr(Erg)
  else begin
    Dec(Erg);
    RekursiverAlgoritmus(a, b, Erg)
  end;
end;


Das mit a := a - b usw. funktioniert. Ich zieh vom Erg immer eins ab - so kommst du auf das exakte Ergebnis.


cuejo - So 24.09.06 20:22

Was ich grade geschrieben habe funktioniert noch nicht so ganz. Denn da es sich um eine Funktion mit rückgabewert handelt, musst du die auch noch a zuweisen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function RekursiverAlgoritmus(a, b : Integer) : Integer;
begin
  if a > b then begin
    a:= a-b;
    a:=RekursiverAlgoritmus(a, b);
  end;
  if a < b then begin
    b:= b-a;
    a:=RekursiverAlgoritmus(a, b);
  end;
  if a=b then RekursiverAlgoritmus:= a;
end;


cuejo - So 24.09.06 20:56

Trotz, dass user profile iconsoisseteben schon einen funktionierenden Algorithmus vorgestellt hat, habe ich mich noch mal daran gesetzt, weil meiner noch Fehler hatte. Aber jetzt denke ich, dass meiner nach völliger überarbeitung jetzt funktionieren sollte. Schau ihn dir mal genau an:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function RekursiverAlgorithmus(a, b : Integer) : Integer;
begin
  if a<b then result:=RekursiverAlgorithmus(a,b-a);
  if a>b then result:=RekursiverAlgorithmus(a-b,b);
  if a=b then result:=a;
end;


soisseteben - So 24.09.06 22:08

wenn der funktioniert, ist das natürlich wesentlich schicker :zustimm: