Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem der Erbteilung ? (https://www.delphipraxis.net/80964-problem-der-erbteilung.html)

-lx- 20. Nov 2006 22:58

Re: Problem der Erbteilung ?
 
So... nun hier die finale Version samt Ausgabe der Stellen der benutzen Zahlen.


Delphi-Quellcode:

[...]


type
  TFeld        = Array[1..5] of Integer ;
  TFeldBoolean = Array[1..5] of Boolean ;


[...]


var
  Form1: TForm1;
  Feld: TFeld = (1,9,5,3,8) ;
  Selectiert: TFeldBoolean = (False, False, False, False, False) ;

implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);

    procedure ShowSelection ;
    var i: Integer ;
        begin
          For i:= 1 To length(Selectiert) Do
              begin
                If Selectiert[i] Then
                    begin
                      Memo1.Lines.Add('An Feldposition ' + IntToStr(i) + ' --> ' + IntToStr(Feld[i])) ;
                      Selectiert[i]:= False ;
                    end;
              end;
          Memo1.Lines.Add('---------------------------') ;
          Memo1.Lines.Add(' ') ;
        end;


    function Summieren(): Integer ;
    var i, tmp: Integer ;
        begin
          tmp:= 0 ;
          For i:= 1 To length(Feld) Do
              begin
                tmp:= tmp + Feld[i] ;
              end;
          result:= tmp ;
        end;


    procedure SucheLoesung(i, Erbhaelfte, TErbe: Integer) ;
    var j: Integer ;
        begin
        { Memo1.Lines.Add('i: ' + IntToStr(i)) ;
          Memo1.Lines.Add('Erbhaelfte: ' + IntToStr(Erbhaelfte)) ;
          Memo1.Lines.Add('TErbe: ' + IntToStr(TErbe)) ;
          Memo1.Lines.Add('__________') ; }

          For j:= i To length(Feld) Do
              begin

                If (TErbe + Feld[j]) = Erbhaelfte Then
                    begin
                      Selectiert[j]:= True ;
                      Memo1.Lines.Add('Erbe teilbar!') ;
                      Memo1.Lines.Add('Erbe pro Person: ' + IntToStr(TErbe+Feld[j]) + ' €') ;
                      Memo1.Lines.Add(' ') ;
                      Memo1.Lines.Add(' ') ;
                      Showselection;
                    end

                Else If (TErbe + Feld[j]) < Erbhaelfte Then
                    begin
                      If j < length(Feld) Then
                          begin
                            Selectiert[j]:= True ;
                            SucheLoesung(j+1, Erbhaelfte, TErbe+Feld[j]) ;
                            Selectiert[j]:= False ;
                          end;
                    end;

              end;
        end;


begin

If (Summieren mod 2) = 0 Then SucheLoesung(1, Summieren div 2, 0)
  Else Memo1.Lines.Add('Erbe nicht teilbar!') ;

end;

end.

Cöster 21. Nov 2006 08:05

Re: Problem der Erbteilung ?
 
Der Code sieht gut aus. Ich denke, Zeile 34 (Selektiert[I] := False) könntest du dir sogar noch sparen, denn beim Auflösen der Inkarnationen geschieht dies sowieso.

Cöster 21. Nov 2006 14:28

Re: Problem der Erbteilung ?
 
Was mir noch aufgefallen ist:

Wenn eine Lösung gefunden wurde, wird die For-Schleife von j nicht abgebrochen. Selbst, wenn man nach 'ShowSelection' (Z. 72) Break oder Exit aufrufen würde, würde aber nur die aktuelle Inkarnation abgebrochen. In den unteren Inkarnationen wird die Schleife auf jeden Fall zuende (bis j = Length(Feld)) durchlaufen.

Wie ließe sich das denn lösen?

Der_Unwissende 21. Nov 2006 14:40

Re: Problem der Erbteilung ?
 
Zitat:

Zitat von Cöster
Wenn eine Lösung gefunden wurde, wird die For-Schleife von j nicht abgebrochen. Selbst, wenn man nach 'ShowSelection' (Z. 72) Break oder Exit aufrufen würde, würde aber nur die aktuelle Inkarnation abgebrochen. In den unteren Inkarnationen wird die Schleife auf jeden Fall zuende (bis j = Length(Feld)) durchlaufen.

Wie ließe sich das denn lösen?

Ist die Signatur nicht vorgegeben, sondern entwickelt man eine Lösung für ein Problem (und macht das rekursiv), so wird man hier wahrscheinlich mind. zwei Dinge anders machen. Das eine ist, man arbeitet mit einem Akkumulator. Das ist eine Art zusätzlicher Parameter, in der die Lösung mitgeschleppt wird. Da diese sich über die Rekursion aufbaut, gibt es einen Aufruf an dem die Lösung feststeht. Hier braucht man dann (mit Akkumulator) nicht zurückspringen. Das kann ordentlich Ressourcen schonen.
Der andere Punkt ist, bei so einem Problem kann man z.B. einer Funktion einen Rückgabewert geben, der anzeigt ob die Lösung gefunden wurde (auch ein globales Flag wäre denkbar), dann sollte man prüfen ob das Ergebnis eines Aufrufs gültig war und ggf. die weitere Ausführung des Aufrufs abbrechen.

Noch wahrscheinlicher würde man aber aus dem Grund die Rekursion gerade vermeiden und sich für eine Iteration entscheiden

Gruß Der Unwissende

-lx- 21. Nov 2006 18:25

Re: Problem der Erbteilung ?
 
Also ist es richtig ? Bzw. könnt ihr den Code bestätigen ? =)

Der_Unwissende 21. Nov 2006 18:44

Re: Problem der Erbteilung ?
 
Zitat:

Zitat von -lx-
Also ist es richtig ? Bzw. könnt ihr den Code bestätigen ? =)

Schon, aber sowas ist immer ohne Gewähr. Das hat aber schon jmd. gemacht!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz