AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Ziehen mit Zurücklegen aber ohne Reihenfolge
Thema durchsuchen
Ansicht
Themen-Optionen

Ziehen mit Zurücklegen aber ohne Reihenfolge

Ein Thema von Meflin · begonnen am 28. Mär 2009 · letzter Beitrag vom 28. Mär 2009
Antwort Antwort
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#1

Ziehen mit Zurücklegen aber ohne Reihenfolge

  Alt 28. Mär 2009, 16:59
Moin moin!

Ich stehe gerade etwas auf dem Schlauch.

Gegeben ist eine Menge, z.B. ABCD und eine Länge n (z.B. 3). Ermittelt werden sollen dann:

AAA
AAB
AAC
AAD
ABB
ABC
ABD
ACC
ACD
ADD
BBB
BBC
BBD
CCC

Meine Versuche führen entweder nur zu Permutationen (also zu wenigen) oder gleich zu den Kombinationen (also zu vielen). Knackpunkt ist, dass es nicht auf die Reihenfolge ankommt.

Irgendwie mag mir nix einfallen. Vielleicht hat ja jemand ne Idee (Pseudocode reicht mir hier völlig, deswegen auch keine Delphi-Sparte )
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Ziehen mit Zurücklegen aber ohne Reihenfolge

  Alt 28. Mär 2009, 17:17
Vielleicht hilft dir Wikipedia weiter

http://de.wikipedia.org/wiki/Kombina...8Repetition.29
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#3

Re: Ziehen mit Zurücklegen aber ohne Reihenfolge

  Alt 28. Mär 2009, 17:30
Zitat von jfheins:
Vielleicht hilft dir Wikipedia weiter
Nciht wirklich. Da wird nur die Anzahl betrachtet (die mir persönlich ber völlig schnurz ist), aber nicht, wie man auf die Kombinationen selbst kommt.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Ziehen mit Zurücklegen aber ohne Reihenfolge

  Alt 28. Mär 2009, 17:40
Aso ... wie wärs damit: (ungetestet, basiert auf deiner Aufzählung ausm ersten Post)

Code:
for (char eins = A; eins <= 'D'; eins++)
{
  for (char zwei = eins; zwei <= 'D'; zwei++)
  {
    for (char drei = zwei; drei <= 'D'; drei++)
    {
      print(eins + zwei + drei);
    }
  }
}
Du hast ja nach Pseudocode gefragt

Falls es nicht immer drei sein sollen: Rekusion benutzen
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.586 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Ziehen mit Zurücklegen aber ohne Reihenfolge

  Alt 28. Mär 2009, 18:03
Wie wäre es so? (Geht ab Delphi 2005)
Delphi-Quellcode:
procedure TForm164.Button1Click(Sender: TObject);
type
  TMyCharSet = set of Char;

  procedure GetCombinations(const Data: TMyCharSet; Count: Integer;
    Results: TStrings; CurChar: Char; CurPrefix: String = ''; CurPos: Integer = 1);
  var
    Cur: Char;
  begin
    for Cur in Data do
      if Cur >= CurChar then
        if CurPos < Count then
          GetCombinations(Data, Count, Results, Cur, CurPrefix + Cur, CurPos + 1)
        else
          Results.Add(CurPrefix + Cur);
  end;

var
  ResultList: TStringList;
begin
  ResultList := TStringList.Create;
  GetCombinations(['A', 'B', 'C', 'D'], 3, ResultList, 'A');
  ShowMessage(ResultList.Text);
  ResultList.Free;
end;
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: Ziehen mit Zurücklegen aber ohne Reihenfolge

  Alt 28. Mär 2009, 18:10
Oh, dir war auch gerade langweilig ?

Ich habs so:
Code:
public partial class Form1 : Form
    {
        private List<char> Buchstaben;

        public Form1()
        {
            InitializeComponent();

            Buchstaben = new List<char>();

            Buchstaben.AddRange(new char[] {'A', 'B', 'C', 'D'});
        }

        private void Kombinationen<Type>(IList<Type> Menge, int count)
        {
            Kombinationen<Type>(Menge, count, 0, new Stack<Type>());
        }

        private void Kombinationen<Type>(IList<Type> Menge, int count, int start, Stack<Type> Elemente)
        {
            if (count == 0)
            {
                String kombi = "";
                // evtl. Stringbuilder benutzen
                foreach (var elem in Elemente)
                {
                    kombi = elem.ToString() + ' ' + kombi;
                }
                listBox1.Items.Add(kombi);
            }
            else
            {
                for (int i = start; i < Menge.Count(); i++)
                {
                    Elemente.Push(Menge[i]);
                    Kombinationen<Type>(Menge, count - 1, i, Elemente);
                    Elemente.Pop();
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Kombinationen<char>(Buchstaben, 3);
        }
    }
Hier übrigens mein Ergebnis:
Code:
A A A
A A B
A A C
A A D
A B B
A B C
A B D
A C C
A C D
A D D
B B B
B B C
B B D
B C C
B C D
B D D
C C C
C C D
C D D
D D D
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#7

Re: Ziehen mit Zurücklegen aber ohne Reihenfolge

  Alt 28. Mär 2009, 19:44
Tjö Jungs, so hatt ich das eigentlich auch. Wieso ging das nicht

Danke jedenfalls
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:15 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