Der Stacküberlauf hängt mit dem pred(x) zusammen:
Immer, wenn die Zahl nicht gerade ist, wird geprüft ob sie ungerade ist. Aber sie wird zuvor durch pred(x) wieder gerade gemacht, und deshalb hat man immer genau die falsche Zahl in der Abfrage und die Gehschichte geht ins unendliche...
So wies unten ist, funktionierts:
Delphi-Quellcode:
unit fUnGerade;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 =
class(TForm)
btStart: TButton;
mmAus: TMemo;
edZahl: TEdit;
procedure btStartClick(Sender: TObject);
function odd(x: integer): boolean;
function even(x: integer): boolean;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.odd(x: integer): boolean;
begin
if (x
mod 2 <> 0)
then
begin
result:= false;
mmAus.Lines.Add('
Die Zahl ' + IntToStr(x) + '
ist Ungerade');
mmAus.Lines.Add('
Die Ausgabe befindet sich in der Funktion Odd');
end
else
result:= even((x));
end;
function TForm1.even(x: integer): boolean;
begin
if (x
mod 2 = 0)
then
begin
result:= true;
mmAus.Lines.Add('
Die Zahl ' + IntToStr(x) + '
ist Gerade');
mmAus.Lines.Add('
Die Ausgabe befindet sich in der Funktion Even');
end
else
result:= odd((x));
end;
procedure TForm1.btStartClick(Sender: TObject);
var
x: integer;
begin
x:= StrToInt(edZahl.Text);
even(pred(x));
end;
end.