Autor |
Beitrag |
Baphomet
      
Beiträge: 20
Delphi 7
|
Verfasst: 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:
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
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: So 24.09.06 14:52
Baphomet 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 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 
      
Beiträge: 20
Delphi 7
|
Verfasst: 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
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: So 24.09.06 19:49
Baphomet hat folgendes geschrieben: | in einer Funktion sind doch Funktionsname und result das gleiche, oder nicht?
|
Achso, wusste ich nicht, tut mir Leid. 
_________________ Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
|
|
cuejo
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: So 24.09.06 19:55
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; |
_________________ Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
|
|
soisseteben
      
Beiträge: 111
Win XP
D7
|
Verfasst: 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 = 0) and (b mod Erg = 0) then 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
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: 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; |
_________________ Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
|
|
cuejo
      
Beiträge: 142
Win XP
Delphi 7 Personal und 2005 PE
|
Verfasst: So 24.09.06 20:56
Trotz, dass soisseteben 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; |
_________________ Computer sind dumm, aber fleißig. Deshalb arbeite ich so gerne damit.
|
|
soisseteben
      
Beiträge: 111
Win XP
D7
|
Verfasst: So 24.09.06 22:08
wenn der funktioniert, ist das natürlich wesentlich schicker 
_________________ „Wer nur nach dem Zweck der Dinge fragt, wird ihre Schönheit nie entdecken.“ - (Halldór Laxness)
|
|