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)
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; |
|
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
Baphomet 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 = 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.
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
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; |
soisseteben - So 24.09.06 22:08
wenn der funktioniert, ist das natürlich wesentlich schicker :zustimm:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!