Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wie findet man ale Kombinationen? (https://www.delphipraxis.net/38809-wie-findet-man-ale-kombinationen.html)

Nicolai1234 24. Jan 2005 14:49


Wie findet man ale Kombinationen?
 
Ich denke seit geraumer Zeit über das Problem nach, abr mir fällt keine Lösung ein...
Ich habe auch gesucht, aber wahrscheinlich die falschen Begriffe eingegeben, aber nichts gefunden.

Ich habe 25 Wörter/Zahlen/Zeichen oder was auch immer und möchte nun alle Kombinationen herausfinden.

Ich brauche eine Schleife, die ein Array[1..25] of Integer/String befüllt. Die Schleife sollte das Array in jedem Durchgang anders befüllen, ohne eine Kombinantion doppelt zu verwenden.
Wie kann ich sowas machen? Oder wonach muss ich suchen, um weiter zu kommen?
Vielen Dank im voraus
Nicolai

ibp 24. Jan 2005 15:05

Re: Wie findet man ale Kombinationen?
 
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    meAusg: TMemo;
    edWort: TEdit;
    btStart: TButton;
    procedure btStartClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure tausche(var s:string; const k:integer);
var
  pu: Tstringlist;
  i: integer;
  c: char;
begin
  pu := Tstringlist.Create; //TcharList gibts nicht!
  try
    pu.Sorted := false;
    for i := k to length(s) do
      pu.Add(s[i]);
    pu.Sort;
    //Tausche mit dem kleinsten aus pu, das größer als s[k-1] ist
    c := s[k-1];
    for i := 0 to pu.Count -1 do
      if c < pu[i][1] then
      Begin
        s[k-1] := pu[i][1];
        pu[i] := c; //getauscht!
        break;
      End;
    pu.Sort;
    for i := k to length(s) do
      s[i] := pu[i-k][1];
  finally
    pu.free
  End;
end;

procedure naechstePermutation(var s: string);
  var k:integer; //z.B. s='12543' k=3
begin
  k:= length(s);
  while (k > 0) and
        (s[k] < s[k-1]) do
    dec(k);

  if k =1 then
    s := ''
  else
    Tausche(s,k);
end;

procedure TForm1.btStartClick(Sender: TObject);
var
  s: string;
  zaehl: integer;
begin
  s := edWort.Text;
  meAusg.Lines.Clear;
  zaehl := 0;
  repeat
    inc(zaehl);
    meAusg.Lines.Add(s);
    naechstePermutation(s);
  until s = '';
  meAusg.Lines.Add('&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;');
  meAusg.Lines.add('Anzahl:'+intToStr(zaehl));
end;

damit klappts! aber achtung keine zeichen doppelt verwenden! dafür musst du das dann ein wenig umschreiben!

jfheins 24. Jan 2005 15:43

Re: Wie findet man ale Kombinationen?
 
Wenn du nur die Anzahl brauchst, kannst du diese wie folgt errechnen:
Code:
f(0) = 1
f(x) = f(x-1) * x
Also
Code:
f(2) = 2
f(3) = 6
f(4) = 24
f(5) = 120
f(6) = 720
f(7) = 5040
f(8) = 40320
Das kommt, weil es bei 2 Zeichen genau 2 Kombinationen gibt.
Dann gibt es z.B. bei 3 Zeichen (ABC) 2*3 = 6 Kombinationen.
Es gibt in diesem Fall nämlich 2 Kombin. mit Axx, 2 mit Bxx und 2 mit Cxx, also 6

Bei 4 Zeichen gibt es 6 mal Axxx, 6 mal Bxxx, 6 mal Cxxx und 6 mal Dxxx

usw.

jfheins 24. Jan 2005 20:47

Re: Wie findet man ale Kombinationen?
 
Ach ja, vereinfacht:
Code:
f(x) = x!

dizzy 25. Jan 2005 04:42

Re: Wie findet man ale Kombinationen?
 
Und diese ganzen Variationen nennen sich dann "Permutationen". (Falls mal einer danach googlen will oder so :))

negaH 2. Mai 2005 05:12

Re: Wie findet man ale Kombinationen?
 
http://www.delphipraxis.net/viewtopic.php?p=53652#53652

gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 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