AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem der Erbteilung ?

Ein Thema von -lx- · begonnen am 18. Nov 2006 · letzter Beitrag vom 21. Nov 2006
Antwort Antwort
Seite 3 von 3     123   
-lx-
(Gast)

n/a Beiträge
 
#21

Re: Problem der Erbteilung ?

  Alt 20. Nov 2006, 23:58
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.
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#22

Re: Problem der Erbteilung ?

  Alt 21. Nov 2006, 09:05
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.
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#23

Re: Problem der Erbteilung ?

  Alt 21. Nov 2006, 15:28
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?
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#24

Re: Problem der Erbteilung ?

  Alt 21. Nov 2006, 15:40
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
  Mit Zitat antworten Zitat
-lx-
(Gast)

n/a Beiträge
 
#25

Re: Problem der Erbteilung ?

  Alt 21. Nov 2006, 19:25
Also ist es richtig ? Bzw. könnt ihr den Code bestätigen ? =)
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#26

Re: Problem der Erbteilung ?

  Alt 21. Nov 2006, 19:44
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!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 Uhr.
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