Autor Beitrag
Baphomet
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20


Delphi 7
BeitragVerfasst: So 24.09.06 14:18 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: So 24.09.06 14:52 
user profile iconBaphomet hat folgendes geschrieben:

ausblenden 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;


_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
Baphomet Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20


Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: 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:

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
cuejo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: So 24.09.06 19:55 
Versuchs mal so:
ausblenden 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;

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
soisseteben
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 111

Win XP
D7
BeitragVerfasst: So 24.09.06 20:17 
Hi,
so klappts:

ausblenden 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.

_________________
„Wer nur nach dem Zweck der Dinge fragt, wird ihre Schönheit nie entdecken.“ - (Halldór Laxness)
cuejo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: 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:
ausblenden 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;

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
cuejo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 142

Win XP
Delphi 7 Personal und 2005 PE
BeitragVerfasst: 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:
ausblenden 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;

_________________
Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
soisseteben
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 111

Win XP
D7
BeitragVerfasst: So 24.09.06 22:08 
wenn der funktioniert, ist das natürlich wesentlich schicker :zustimm:

_________________
„Wer nur nach dem Zweck der Dinge fragt, wird ihre Schönheit nie entdecken.“ - (Halldór Laxness)