
A mellékelt példaprogram megnyitása előtt a Variation.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
Ha n elem közül k elemet kell kiválasztanunk úgy, hogy minden elemet legfeljebb egyszer választunk ki, és a sorrendre is tekintettel vagyunk, akkor n elem k-adosztályú, ismétlés nélküli variációit kapjuk. A variációk száma: n!/(n-k)!.
Ha a kiválasztás során visszatevéssel járunk el (azaz minden kivétel után visszatesszük a húzott elemet), akkor ismétléses variációról beszélünk. A variációk száma ebben az esetben: n^k.
A használható elemeket a komponens Items tulajdonságában adhatjuk meg. A Level property-ben adhatjuk meg a húzandó elemek számát. Ha a Repetable tulajdonság értékét igazra állítjuk, akkor ismétléses, egyébként ismétlés nélküli variációt kalkulálunk.
Az Execute metódus meghívásával, a FileName property-ben megadott TXT típusú állományban létrejön a kalkuláció. Minden egyes kalkuláció külön sorba kerül. Az állomány utolsó sora a variációk számát tartalmazza.
Ha csak egy számítást akarunk elvégezni, és nem vagyunk kíváncsiak a részletekre, csak az eredményre, akkor használhatjuk az alábbi függvényeket.
function GetVariations(Items, Level: Byte): Extended;
function GetRepVariations(Items, Level: Byte): Extended;
Az első az ismétlés nélküli, a második az ismétléses variációk kiszámolására szolgál. Az Items paraméterben adhatjuk meg az elemek számát, a Level paraméterben pedig a húzandó elemek számát.
Komponensünket a TComponent osztályból származtatjuk.
A GetVariations és GetRepVariations metódusokban nincs más dolgunk, mint a megfelelő képletek alapján elvégezni a számításokat.
Az Execute metódusban létre kell hoznunk a FileName property-ben megadott állományt. Az állományt globális változóként deklaráltuk, szövegfájlként.
A variációk kalkulálását a Count függvény végzi el, rekurzív módon. A függvény kezdeti értékét az Execute metódusban kell beállítanunk.
procedure TVariation.Count(List: TStringList; ILevel: Integer; s: String);
var
i: Integer;
l: TStringList;
A függvény List paramétere tartalmazza az aktuálisan rendelkezésre álló elemeket. Az ILevel paraméter a rekurzió szintjét adja vissza. Az s paraméter tartalmazza az eddig meghatározott elemeket, vesszővel elválasztva.
A függvény működését két logikai egységre kell bontanunk.
if ILevel=FLevel then begin
for i:=0 to List.Count-1 do begin
WriteLn(f,s+List[i]);
FRows:=FRows+1;
end;
end
Ha az ILevel értéke megegyezik a Level property-ben megadott értékkel, az azt jelenti, hogy a kalkuláció utolsó eleménél járunk, így a kalkulált elemet el kell mentenünk a megadott állományba.
Ha ez a feltétel nem teljesül, akkor a függvényt újra meg kell hívnunk, rekurzív módon.
else begin
for i:=0 to List.Count-1 do begin
if ILevel=1 then s:='';
l.Assign(List);
if not FRepetable then
l.Delete(i);
Count(l,ILevel+1,s+List[i]+',');
end;
end;
A rekurzió során, ha ismétlés nélküli variációt számolunk, ki kell vennünk az éppen felhasznált elemet a listából. Ehhez az l segédobjektumot használjuk. Az új függvényhíváskor a felhasznált elem már nem létezik a List objektumban.